Saturday, 12 August 2017

UVa 657 - The die is cast

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll x[4]={1,0,-1,0};
ll y[4]={0,1,0,-1};
ll g[60][60];
bool visited[60][60];
ll w,h;
ll ct,id;
struct s
{
    ll px,py;
}tmp[1000];
void dfs(ll,ll);
void dfs1(ll,ll);
void dfs1(ll p,ll q)
{
    //cout<<p<<" "<<q<<" \n";
    visited[p][q]=1;
    for(ll i=0;i<4;i++)
    {
        ll u,v;
        u=p+x[i];
        v=q+y[i];
        if(g[u][v]==1&&visited[u][v]==0&&u>=0&&v>=0&&u<h&&v<w)
        {
            //cout<<p<<" "<<q<<" "<<u<<" "<<v<<endl;
            dfs1(u,v);
        }
        if(g[u][v]==0&&visited[u][v]==0&&u>=0&&v>=0&&u<h&&v<w)
        {
            //cout<<u<<" "<<v<<endl;
            //dfs(u,v);
            tmp[id].px=u;
            tmp[id].py=v;
            id++;
        }
    }
    return;
}
void dfs(ll xx,ll yy)
{
    //cout<<xx<<" "<<yy<<endl;
    ll u,v,i;
    if(!visited[xx][yy]&&g[xx][yy]==1)
    {
        visited[xx][yy]=1;
        //cout<<xx<<"="<<yy<<endl;
        ct++;
        for(i=0;i<4;i++)
        {
            u=xx+x[i];
            v=yy+y[i];
            if(u>=0&&v>=0&&u<h&&v<w&&!visited[u][v]&&g[u][v]!=-1)
            {
                if(g[u][v]==1)
                {
                    dfs1(u,v);
                }
                if(g[u][v]==0)
                {
                    dfs(u,v);
                }
            }
        }
    }
    if(!visited[xx][yy]&&g[xx][yy]==0)
    {
        //cout<<xx<<"----"<<yy<<endl;
        visited[xx][yy]=1;
        for(i=0;i<4;i++)
        {
            u=xx+x[i];
            v=yy+y[i];
            if(u>=0&&v>=0&&u<h&&v<w&&!visited[u][v]&&g[u][v]!=-1)
            {
                if(g[u][v]==1)
                {
                    //cout<<u<<"-"<<v<<endl;
                    ct++;
                    dfs1(u,v);
                }
                if(g[u][v]==0)
                {
                    dfs(u,v);
                }
            }
        }
    }
    //cout<<"ct::"<<ct<<endl;
    return;
}
int main()
{
    //ofstream o("op.txt");
    ll i,j,k,l,m,n,cnt=1;
    while(cin>>w>>h)
    {
        ll res;
        if(w==0&&h==0)
            break;
        memset(g,0,sizeof(g));
        memset(visited,0,sizeof(visited));
        vector<ll>v;
        for(i=0;i<h;i++)
        {
            for(j=0;j<w;j++)
            {
                char c;
                cin>>c;
                if(c=='.')
                {
                    g[i][j]=-1;
                }
                if(c=='X')
                {
                    g[i][j]=1;
                }
            }
        }
        for(i=0;i<h;i++)
        {
            for(j=0;j<w;j++)
            {
                if(visited[i][j]==0&&g[i][j]!=-1)
                {
                    //cout<<i<<"==="<<j<<endl;
                    ct=0;
                    id=0;
                    dfs(i,j);
                    for(k=0;k<id;k++)
                    {
                        dfs(tmp[k].px,tmp[k].py);
                    }
                    //cout<<"CT:"<<ct<<endl;
                    v.push_back(ct);
                }
            }
        }
        printf("Throw %lld\n",cnt);
        //o<<"Throw "<<cnt<<endl;
        sort(v.begin(),v.end());
        for(i=0;i<v.size();i++)
        {
            printf("%lld",v[i]);
            //o<<v[i];
            if(i!=v.size()-1)
            {
                //o<<" ";
                printf(" ");
            }
        }
        //o<<endl<<endl;
        cnt++;
        printf("\n\n");
    }
    return 0;
}

No comments:

Post a Comment