zoukankan      html  css  js  c++  java
  • POJ 1481

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


     

  • 相关阅读:
    iframe框架
    HTML 中 id与name 区别
    使用display:inline-block产生间隙
    html5新增语义化标签
    子选择器与后代选择器的区别
    各种居中问题
    腾讯 地图 机器学习岗 春招实习123面(猝)
    腾讯 微信春招nlp实习生一面二面(猝)
    264. Ugly Number II(丑数 剑指offer 34)
    263. Ugly Number(判断是否是丑数 剑指offer34)
  • 原文地址:https://www.cnblogs.com/lj030/p/3002188.html
Copyright © 2011-2022 走看看