Uva657 - The die is cast

原题链接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\n",++cnt);
        for(int i=0;i<t-1;i++)
        printf("%d ",num[i]);
        printf("%d\n",num[t-1]);
        printf("\n"); 
    }
    return 0;
}

 

posted @ 2015-09-04 22:44  __NaCl  阅读(175)  评论(0编辑  收藏  举报