题意:给出图像,输出所表示点数的升序
思路:利用两次DFS,一次用来搜索色子的位置,在这个DFS中再嵌套一个DFS,搜索点数的大小。。。。用标记的方法,WA了无数次,而且还找不到原因。。。。所以就将遍历过的点都转化为‘.’,才A了。。。万般无奈。。。
#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #include<string> #include<algorithm> using namespace std; char a[55][55]; int result[100]; int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1}; int cnt; void dfs1(int x,int y) { if (a[x][y]!='X') return ; else a[x][y]='.'; dfs1(x-1,y); dfs1(x,y-1); dfs1(x,y+1); dfs1(x+1,y); } void dfs(int x,int y) { if (a[x][y]=='.') return ; if (a[x][y]=='X') { dfs1(x,y); cnt++; } a[x][y]='.'; dfs(x-1,y); dfs(x,y-1); dfs(x,y+1); dfs(x+1,y); } int main() { int w, h, num=1, ct; while (scanf("%d%d", &w, &h) != EOF) { if (w == 0 && h == 0) break; memset(a,'.',sizeof(a)); for(int i = 1; i <= h; i++) { getchar(); for(int j = 1; j <= w; j++) scanf("%c", &a[i][j]); } ct = 0; for(int i = 1; i <= h; i++) for(int j = 1; j <= w; j++) if (a[i][j] == '*' || a[i][j] == 'X') { cnt = 0; dfs(i,j); result[ct++] = cnt; } printf("Throw %d\n",num++); sort(result, result + ct); for(int i = 0; i < ct; i++) { if(i) printf(" "); printf("%d", result[i]); } printf("\n\n"); } return 0; }