题意:找出R*C的图中不想交的矩形个数,如果有一个相交矩形就输出Bad placement. 不然就输出能放多少船
不相交是说对于一个矩形(‘#’组成)周围一圈都是由‘.’包围,所以我们只用求出以某个点为起点的最大和最小的x,y的值,并且在搜索时‘#’的个数rec,如果rec=(maxx-minx+1)*(maxy-miny+1)成立,则这个矩形合法
#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;
}