(dfs求连通块)怎么看着这么熟悉呢!原来是紫书上的一道例题……直接见注释吧
#include<bits/stdc++.h> using namespace std; const int maxn=100+5; char Map[maxn][maxn]; int m,n,flag[maxn][maxn]; void dfs(int r,int c,int id) { if(r<0||r>=m||c<0||c>=n) return ;//出界的格子 if(flag[r][c]||Map[r][c]!='@') return ;//不是'@'或者已经访问过的格子 flag[r][c]=id;//连通分量编号 for(int i=-1;i<=1;i++)//搜索相邻及其对角线 for(int j=-1;j<=1;j++) if(i||j) dfs(r+i,c+j,id); } int main() { while(scanf("%d%d",&m,&n)==2&&m) { for(int i=0;i<m;i++) scanf("%s",Map[i]); memset(flag,0,sizeof(flag)); int ans=0; for(int i=0;i<m;i++) for(int j=0;j<n;j++) if(!flag[i][j]&&Map[i][j]=='@') dfs(i,j,++ans); printf("%d\n",ans); } return 0; }