题目链接: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;
}