【其他】wikioi 1536 海战
题目链接: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;}