网上说是并查集的题目,bfs就过了,不过其中也有并查集的感觉。每次以一个点为起点搜索,搜到的都属于一个集合,用了几次bfs,就是有几个集合。 #include<iostream> #include<queue> using namespace std; int g[11][4]={{1,0,0,1},{1,1,0,0},{0,0,1,1},{0,1,1,0},{1,0,1,0}, {0,1,0,1},{1,1,0,1},{1,0,1,1},{0,1,1,1},{1,1,1,0},{1,1,1,1}}; int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; struct node { int i,j; }; queue<node>que; char a[55][55]; bool use[55][55]; int n,m; void bfs(int i,int j) { node temp,add; int next_i,next_j,k; temp.i=i,temp.j=j; while(!que.empty()) que.pop(); que.push(temp); use[i][j]=1; while(!que.empty()) { temp=que.front(); que.pop(); for(k=0;k<4;k++) { next_i=temp.i+dir[k][0]; next_j=temp.j+dir[k][1]; if(next_i<0||next_i>m-1||next_j<0||next_j>n-1) continue; if(g[a[temp.i][temp.j]-'A'][k]&& g[a[next_i][next_j]-'A'][(k+2)%4]&&!use[next_i][next_j]) { use[next_i][next_j]=1; add.i=next_i,add.j=next_j; que.push(add); } } } } int main() { int t,i,j,ans; while(scanf("%d%d",&m,&n)) { if(m<0&&n<0) break; for(t=0;t<m;t++) scanf("%s",a[t]); memset(use,0,sizeof(use)); ans=0; for(i=0;i<m;i++) for(j=0;j<n;j++) { if(use[i][j]) continue; bfs(i,j); ans++; } printf("%d/n",ans); } return 0; }