poj-1856 Sea Battle

来源:互联网 发布:八爪鱼头部按摩器 知乎 编辑:程序博客网 时间:2024/05/13 15:06

http://poj.org/problem?id=1856

题目大意:合法船只的定义:由#构成的矩形,被一圈“.”所围成的船就是合法船只。如果有不合法的船只输出Bad placement.,否则输出合法船只的个数。

队内赛题,当时题没有读懂还是别人告诉我的,亏数据太水不然比赛时就爆0了。

附上复杂代码:找矩形,然后在判断是否满足条件(比赛时还是不要太紧张为好,思维不求快,求精密)

/*****6 6.....###...###...#..#..#.....#######6 8.....#.###.....###.....#.......##......##..#...#0 05 5##.....###.....##........5 5##.##..#....#..#...#....#5 5###..####.###.......#....Bad placement.5 5##..###..#...#......##...5 5##.####.####......####...Bad placement.There are 5 ships.******/#include <iostream>#include<stdio.h>#include<string.h>using namespace std;int n,m;char S[1005][1005];int G[1005][1005];int B;void dfs(int a,int b){    if(G[a-1][b]||G[a+1][b-1]||G[a+1][b+1]||G[a-1][b+1]||G[a-1][b-1])        B=0;    int q=0;    for(int r=b; r<m; r++)    {        if(S[a][r]!='#')            break;        if(G[a-1][r]||G[a+1][r-1]||G[a+1][r+1]||G[a-1][r+1]||G[a-1][r-1])            B=0;        if(G[a][r])            break;        q++;        //cout<<r<<"->"<<endl;    }    //cout<<a<<" "<<b<<endl;    //cout<<B<<"---"<<endl;    for(int r=a; r<n; r++)    {        int sum=0,t;        if(S[r][b]!='#')            break;        for( t=b; t<m; t++)        {            if(S[r][t]!='#')                break;            if(G[r][t])            {                B=0;                continue;            }            if(S[r][t]=='#')            {                G[r][t]=1;                sum++;            }        }        if(sum!=q)            B=0;    }}int main(){    while(cin>>n>>m&&n!=0&&m!=0)    {        memset(G,0,sizeof(G));        cin.get();        for(int i=0; i<n; i++)            gets(S[i]);        int sum=0;        B=1;        for(int i=0; i<n; i++)        {            if(!B)                break;            for(int j=0; j<m; j++)            {                if(!B)                    break;                if(!G[i][j]&&S[i][j]=='#')                {                    sum++;                    dfs(i,j);                }            }        }        if(B)            cout<<"There are "<<sum<<" ships."<<endl;        else            cout<<"Bad placement."<<endl;    }    return 0;}

大神的神算法:http://blog.csdn.net/mengxiang000000/article/details/51493408

#include <iostream>#include<stdio.h>#include<string>#include<cstring>#include<algorithm>#include<cmath>#define N 1010int maxx,maxy,minx,miny;using namespace std;char map[N][N];int r,c;bool check(int x,int y){    if(x>=0&&x<r&&y>=0&&y<c&&map[x][y]=='#')    return true;    return false;}int dfs(int x,int y){    minx=min(minx,x);    maxx=max(maxx,x);    miny=min(miny,y);    maxy=max(maxy,y);    map[x][y]='.';    int rec=1;    for(int i=-1;i<=1;i++)    for(int j=-1;j<=1;j++)    {        if(check(i+x,j+y))        {            rec+=dfs(i+x,j+y);        }    }    return rec;}int main(){    while(~scanf("%d%d",&r,&c))    {        if(r==0&&c==0) break;        for(int i=0;i<r;i++)        scanf("%s",map[i]);        int ans=0;        for(int i=0;i<r;i++)        for(int j=0;j<c;j++)        {            if(map[i][j]=='#')            {                maxx=minx=i;                maxy=miny=j;                int rec=dfs(i,j);                if(rec==(maxx-minx+1)*(maxy-miny+1))                      ans++;                      else                      {                          ans=-1;//只要有一艘坏船就是bad                          i=r;                          break;                      }            }        }        if(ans==-1)          printf("Bad placement.\n");          else          printf("There are %d ships.\n",ans);    }    return 0;}


0 0
原创粉丝点击