【其他】wikioi 1536 海战

来源:互联网 发布:淘宝礼品卡 日亚 zhihu 编辑:程序博客网 时间:2024/04/30 02:29

题目链接:http://wikioi.com/problem/1536/

分析:

本来看着这个题很像floodfill之类的,被吓哭了。。。但是仔细一看,so easy!

由于船是矩形的,所以从左上向右下搜就行,顺便判断一下,如果左、上都不连那么是一块新的,ans加1。

对于判断是否相邻,有一种简单方法。


如图,无论怎不符合,两船边界的情形肯定是这四种情况之一。所以一一判断即可,不符合便跳出。

代码:

#include<iostream>#include<cstdio>using namespace std;char a[1010][1010];int r,c,ans=0;int main(){   cin>>r>>c;   for (int i=1;i<=r;i++)    for (int j=1;j<=c;j++)    cin>>a[i][j];     for (int i=1;i<=r;i++)    for (int j=1;j<=c;j++)   {       if (a[i][j]=='#')     {bool b=false;                       if (a[i-1][j]=='#')           {               if ((a[i-1][j-1]!='#'&&a[i][j-1]=='#')||(a[i-1][j+1]!='#'&&a[i][j+1]=='#')                  ||(a[i-1][j-1]=='#'&&a[i][j-1]!='#')||(a[i-1][j+1]=='#'&&a[i][j+1]!='#'))                {           cout<<"Bad placement.";           return 0;            }              }       else if (a[i-1][j]!='#'&& a[i][j-1]!='#') ans++;     }      }   cout<<"There are "<<ans<<" ships.";return 0;}