AC啦!!!此题用到了两个DFS,刚开始一直认为两个DFS是交叉的,一直是错。后来从最简单的方面考虑,它遍历它的,它遍历它的,最后搞出来啦。
#include <stdio.h> #include <memory.h> #include <stdlib.h> const int maxn=50+10; char map[maxn][maxn]; int visit[maxn][maxn]; int visit2[maxn][maxn]; int total[maxn]; int amount=0; int m,n,flag; int count1; int dir[4][2]={{0,-1},{-1,0},{0,1},{1,0}}; void dfs(int x,int y); void dfs2(int x,int y); int cmp(const void* aa,const void* bb) { int* a=(int*)aa; int* b=(int*)bb; return *a-*b; } int main() { while(scanf("%d %d",&n,&m)==2) { if(n==0) break; count1=0; memset(total,0,sizeof(total)); memset(visit,0,sizeof(visit)); memset(visit2,0,sizeof(visit2)); amount++; int i,j; for(i=0;i<m;i++) { scanf("%s",map[i]); } for(i=0;i<m;i++) { for(j=0;j<n;j++) { if((map[i][j]=='*'||map[i][j]=='X')&&!visit[i][j]) { count1++; dfs(i,j); } } } qsort(total,count1,sizeof(int),cmp); printf("Throw %d\n",amount); int k; for(k=0;k<count1-1;k++) { if(total[k]!=0) printf("%d ",total[k]); } printf("%d\n",total[k]); printf("\n"); } return 0; } void dfs(int x,int y) { int dx,dy; if(map[x][y]=='.'||visit[x][y]||x<0||x>=m||y<0||y>=n) return; else { visit[x][y]=1; if(map[x][y]=='X'&&visit2[x][y]==0) { total[count1-1]++; for(int k=0;k<4;k++) { dx=x+dir[k][0]; dy=y+dir[k][1]; dfs2(dx,dy); } } for(int k=0;k<4;k++) { dx=x+dir[k][0]; dy=y+dir[k][1]; dfs(dx,dy); } } } void dfs2(int x,int y) { int dx,dy; if(map[x][y]=='.'||visit2[x][y]||x<0||x>=m||y<0||y>=n||map[x][y]=='*') return; else { visit2[x][y]=1; int i; for(i=0;i<4;i++) { dx=x+dir[i][0]; dy=y+dir[i][1]; dfs2(dx,dy); } } }