题目:http://acm.hit.edu.cn/hoj/problem/view?id=3130
本题练习深度优先搜索。
将所有的#标记为未标记,从上到下从左到右依次从每个没标记过的点开始广搜,搜到的点记为已标记,同时记录最小的xl,yl以及最大的xr,yr和搜到的点数。如果搜到的点数不等于根据xl、yl、xr、yr计算出的矩形的面积,则说明有矩形相邻,否则就找到了一个矩形。依次计算即可。
#include <iostream>
#include <stdio.h>
#include <string.h>
#define Max 1003
char c[Max][Max];//从三点钟方向顺时针
int vis[Max][Max];
int total = 0;
int n,m;
int mx[4] = {0,1,0,-1};
int my[4] = {1,0,-1,0};
void dfs(int x,int y)
{
if(x<0 || x>=n || y<0 || y>=m || c[x][y] == '.' || vis[x][y] == 1)
{
return;
}
vis[x][y] = 1;
total++;
for(int k=0;k<4;k++)
{
dfs(x+mx[k],y+my[k]);
}
}
int getx(int x,int y)
{
int tempx = 0;
for(int i=x;i<n;i++)
{
if(c[i][y] == '.')
{
break;
}
else
{
tempx++;
}
}
return tempx;
}
int gety(int x,int y)
{
int tempy = 0;
for(int i=y;i<m;i++)
{
if(c[x][i] == '.')
{
break;
}
else
{
tempy++;
}
}
return tempy;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
while(scanf("%d %d",&n,&m)!=EOF && n!=0 && m!=0)
{
for(int i=0;i<n;i++)
{
scanf(" %s",c[i]);
}
memset(vis,0,sizeof(vis));
int flag = 0;
int num = 0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(c[i][j] == '#' && vis[i][j] == 0)
{
total = 0;//搜索到的点的个数
dfs(i,j);
int tempx = getx(i,j);
int tempy = gety(i,j);
//printf("total = %d,tempx = %d,tempy = %d\n",total,tempx,tempy);
if(total!=tempx *tempy)
{
flag = 1;
break;
}
num++;
}
}
if(flag == 1)
{
break;
}
}
if(flag == 0)
{
printf("%d\n",num);
}
else
{
printf("Oh!My God!\n");
}
}
return 0;
}