UVa572 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=513
也就是求联通块个数
运用dfs
#include <cstdio>
#include <cstring>
#define maxn 105
char map[maxn][maxn];
int vis[maxn][maxn];
int m,n;
void dfs(int r,int c,int cur){
if(map[r][c]!='@'||vis[r][c]>0) return ;
if(r<0||r>=m||c<0||c>=n) return ;
vis[r][c]=cur;
for(int dr=-1;dr<=1;dr++){ //判断8个方向
for(int dc=-1;dc<=1;dc++){
if(dr!=0||dc!=0){
dfs(r+dr,c+dc,cur);
}
}
}
}
int main(){
//freopen("UVa572.txt","r",stdin);
while(scanf("%d%d",&m,&n)!=EOF&&m&&n){
for(int i=0;i<m;i++){
scanf("%s",map[i]);
}
int cur=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<m;i++)
for(int j =0;j<n;j++){
if(map[i][j]=='@'&&vis[i][j]==0)
dfs(i,j,++cur);
}
printf("%d\n",cur);
}
return 0;
}