广搜题,题意为找到图中油田有多少块(相邻油田算入一块)。。。多次广搜,如果碰到'@'则置当前'@'为'*'同时counter++,然后从此点开始一次广搜,期间遇到'@'则立刻置为'*',重复进行直到图中所有点全部遍历完毕
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,m,sum;
char mat[105][105];
bool vis[105][105];
void dfs(int x,int y)
{
if(vis[x][y])
return;
else
{
vis[x][y]=true;
if(mat[x][y]=='@')
{
dfs(x-1,y);
dfs(x-1,y+1);
dfs(x,y+1);
dfs(x+1,y+1);
dfs(x+1,y);
dfs(x+1,y-1);
dfs(x,y-1);
dfs(x-1,y-1);
}
}
}
int main()
{
int i,j;
while(~scanf("%d%d",&n,&m))
{
if (n==0 && m==0) return 0;
memset(vis,0,sizeof(vis));
memset(mat,'*',sizeof(mat));
for(i=0;i<=n+1;i++)
{
vis[i][0]=true;
vis[i][m+1]=true;
}
for(j=0;j<=m+1;j++)
{
vis[0][j]=true;
vis[n+1][j]=true;
}
for(i=1;i<=n;i++)
scanf(" %s",mat[i]+1);//从下标1开始,记得mat[i]+1
sum=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(!vis[i][j]&&mat[i][j]=='@')
{
sum++;
dfs(i,j);
}
}
}
printf("%d\n",sum);
}
}