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);
}
}
}