描述:这道题就是递归套用递归,用两个递归再加上一个快排就可以了AC了,但是交了一次错误答案,可惜了,就是在第一层递归的时候只要递归*上下前后四个方向就可以了,我递归成八个方向的了,-_-......#include <iostream>#include <cstring>#include <cstdio>#include <cstdlib>using namespace std;int count,visit_s[110][110];void dfs_count(int s[110][110],int row,int clow,int visit[110][110]){ if(!visit[row][clow]||s[row][clow]!=2)return; visit[row][clow]=0; dfs_count(s,row-1,clow,visit); dfs_count(s,row,clow-1,visit); dfs_count(s,row,clow+1,visit); dfs_count(s,row+1,clow,visit);}void dfs(int s[110][110],int row,int clow,int visit[110][110]){ if(!s[row][clow]||!visit[row-1][clow-1])return; if(visit_s[row-1][clow-1]==2) { count++; dfs_count(visit,row-1,clow-1,visit_s); } visit[row-1][clow-1]=0; dfs(s,row-1,clow,visit); dfs(s,row,clow-1,visit); dfs(s,row,clow+1,visit); dfs(s,row+1,clow,visit);}int cmp(const void *p1,const void *p2){ return *(int*)p1>*(int*)p2;}int main(){ //freopen("a.txt","r",stdin); int n,m,i,j,flag,k,sum[110]; int str[110][110],visit_str[110][110]; char c; k=0; while(scanf("%d%d",&m,&n)!=EOF) { if(!n&&!m)break; k++; memset(str,0,sizeof(str)); memset(visit_str,0,sizeof(visit_str)); memset(visit_s,0,sizeof(visit_s)); getchar(); for(i=0; i<n; i++) { for(j=0; j<m; j++) { scanf("%c",&c); if(c=='*')visit_str[i][j]=1; if(c=='X')visit_str[i][j]=visit_s[i][j]=2; if(c=='*'||c=='X')str[i+1][j+1]=1; } getchar(); } flag=0; memset(sum,0,sizeof(sum)); for(i=0; i<n; i++) for(j=0; j<m; j++) if(visit_str[i][j]>=1&&str[i+1][j+1]) { count=0; dfs(str,i+1,j+1,visit_str); sum[flag++]=count; } qsort(sum,flag,sizeof(int),cmp); printf("Throw %d\n",k); printf("%d",sum[0]); for(i=1;i<flag;i++) printf(" %d",sum[i]); printf("\n\n"); } return 0;}