poj-1856 Sea Battle

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

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

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

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

/*****
6 6
.....#
##...#
##...#
..#..#
.....#
######
6 8
.....#.#
##.....#
##.....#
.......#
#......#
#..#...#
0 0
5 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 1010
int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值