所谓灌水法?其实就是一个bfs了。
注意此题要求判断是否合法,只需要记录经过的点数,判断它是否是矩形的面积即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
bool vis[1005][1005];
int n,m,map[1005][1005],flag=0,cnt=0;
int dx[]={0,0,1,0,-1},dy[]={0,1,0,-1,0};
struct code
{
	int x,y;
};
queue <code> q;
char s[1005];
bool judge(int x,int y)
{
	if ((x>=1) && (x<=n) && (y>=1) && (y<=m) && (map[x][y]==1) && (vis[x][y]==false))
		return true;
	return false;
}
void bfs(int bx,int by)
{
	int cc=1,maxx=bx,maxy=by;
	while (!q.empty())
		q.pop();
	code begin;
	begin.x=bx;begin.y=by;
	q.push(begin);
	vis[bx][by]=true;
	while (!q.empty())
	{
		code head=q.front();
		q.pop();
		for (int i=1;i<=4;i++)
		{
			if (judge(head.x+dx[i],head.y+dy[i])==true)
			{
				cc++;
				maxx=max(maxx,head.x+dx[i]);
				maxy=max(maxy,head.y+dy[i]);
				code now;
				now.x=head.x+dx[i];now.y=head.y+dy[i];
				vis[now.x][now.y]=true;
				q.push(now);
			}
		}
	}
	if ((maxx-bx+1)*(maxy-by+1)!=cc) flag=1;
}
int main()
{
	memset(vis,false,sizeof(vis));
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
	{
		scanf("%s",s);
		for (int j=0;j<m;j++)
		{
			if (s[j]==‘.‘) map[i][j+1]=0;
			else map[i][j+1]=1;
		}
	}
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++)
			if ((vis[i][j]==false) && (map[i][j]==1))
			{
				cnt++;
				bfs(i,j);
				if (flag==1) 
				{
					printf("Bad placement.\n");
					return 0;
				}
			}
	printf("There are %d ships.\n",cnt);
	return 0;
}
原文:http://www.cnblogs.com/ziliuziliu/p/5179405.html