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


 

posted on 2012-05-21 18:37  lishimin_come  阅读(115)  评论(0编辑  收藏  举报