这种题相信研究过dfs的都做过,这种是非常典型的一类深搜题,深搜0ms水过啊
话不多说,一言不合上代码:
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
#define N 108 //不要问我为什么108这个数,比较吉利
int n,m,vis[N][N],res;
char room[N][N];
int step[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}}; //因为是检测有多少个油田是相通的,所以对于每一个位置有8个搜索方向
void dfs(int x,int y) //在当前点进行搜索
{
int xx,yy,i;
vis[x][y]=1; //标记走过
for(i=0;i<8;i++) //8个方向
{
xx=x+step[i][0];
yy=y+step[i][1]; //设置当前点
if(room[xx][yy]!='@'||vis[xx][yy]==1) //不是油池或者已走过,不符情况,跳过
continue;
vis[xx][yy]=1; //标记走过
dfs(xx,yy); //进入下一层
}
return ;
}
int main()
{
int i,j;
while(~scanf("%d %d",&n,&m))
{
if(m==0) //注意m=0时,输入结束
break;
res=0;
memset(room,0,sizeof(room));
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
scanf("%s",&room[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(room[i][j]=='@'&&vis[i][j]==0) //每一个未走过的油田都是一个搜索的路口
{
dfs(i,j);
res++; //每次搜索完,必存在一个油田
}
}
printf("%d\n",res);
}
return 0;
}