原题链接https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=598
这题就是在一堆*里找X,相邻的X算一个,所以我们可以两次dfs搜索,dfs2搜*有多少堆,dfs2搜一堆*里面有多少个不同的X,然后在按升序把每个堆里面的不同X输出来= =
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; char ma[100][100]; int n,m; int t; int dis[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int num[100]; void dfs1(int x,int y) { int xx,yy; ma[x][y]='*'; for(int i=0;i<4;i++) { xx=x+dis[i][0]; yy=y+dis[i][1]; if(xx<0||xx>=n||yy<0||yy>=m||ma[xx][yy]=='*') continue; if(ma[xx][yy]=='X') dfs1(xx,yy); } } void dfs2(int x,int y) { int xx,yy; ma[x][y]='.'; for(int i=0;i<4;i++) { xx=x+dis[i][0]; yy=y+dis[i][1]; if(xx<0||xx>=n||yy<0||yy>=m||ma[xx][yy]=='.') continue; if(ma[xx][yy]=='X') { dfs1(xx,yy); num[t]++; } if(ma[xx][yy]=='*') dfs2(xx,yy); } } int main() { int cnt=0; while(scanf("%d %d",&m,&n)!=EOF&&m&&n) { t=0; memset(num,0,sizeof(num)); memset(ma,'.',sizeof(ma)); for(int i=0;i<n;i++) scanf("%s",ma[i]); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(ma[i][j]=='*') { dfs2(i,j); t++; } } } sort(num,num+t); printf("Throw %d ",++cnt); for(int i=0;i<t-1;i++) printf("%d ",num[i]); printf("%d ",num[t-1]); printf(" "); } return 0; }