哈哈 ,同學告訴我用兩個dfs,然後自己獨立讀題,參考《入門經典》P107,黑白映像,1Y,歐耶!
#include<cstdio>#include<cstdlib>#include<cstring>char maze[55][55],vis1[55][55],vis2[55][55];int count,num[10000],sum,nn;int cmp(const void *_a,const void *_b){ int *a=(int *)_a; int *b=(int *)_b; return *a-*b;}void dfs(int i,int j){ if(maze[i][j]=='.'||vis1[i][j]) return ; vis1[i][j]=count; dfs(i,j-1); dfs(i,j+1); dfs(i-1,j); dfs(i+1,j);}void redfs(int i,int j){ if(maze[i][j]!='X'||vis2[i][j]) return ; vis2[i][j]=1; nn++; redfs(i,j-1); redfs(i,j+1); redfs(i-1,j); redfs(i+1,j);}int main(){ /*freopen("in.txt","r",stdin);*/ int w,h,thro=0; char c; while(scanf("%d %d\n",&w,&h)!=EOF&&(w||h)) { thro++; memset(maze,'.',sizeof(maze)); memset(vis1,0,sizeof(vis1)); memset(vis2,0,sizeof(vis2)); for(int i=0; i<h; i++) { for(int j=0; j<w; j++) { scanf("%c",&c); maze[i+1][j+1]=c; } getchar(); } count=0; printf("Throw %d\n",thro); for(int i=0; i<=h; i++) { for(int j=0; j<=w; j++) { if(!vis1[i][j]&&maze[i][j]!='.') { count++; dfs(i,j); } } } for(int i=1;i<=count;i++) { num[i-1]=0; for(int j=0;j<=h;j++) { for(int k=0;k<=w;k++) { if(!vis2[j][k]&&vis1[j][k]==i&&maze[j][k]=='X') { redfs(j,k); num[i-1]++; } } } } qsort(num,count,sizeof(num[0]),cmp); printf("%d",num[0]); for(int i=1;i<count;i++) printf(" %d",num[i]); printf("\n\n"); } return 0;}
用count標記找到的骰子的個數,dfs()函數找出一個骰子,把它的每一個點的vis[][]標記為當時的count,用redfs()函數尋找每一個骰子中的點數。