CodeForces 616C The Labyrinth

先预处理出所有连通块,对于每一个*,看他四周的连通块即可

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;

const int maxn=1000+10;
char s[maxn][maxn];
int Map[maxn][maxn];
int n,m;
int dir[4][2];
int Belong[maxn*maxn];//每个点属于哪个联通快
int tot[maxn*maxn];//每个联通快有几个点
int Block;
int TT;
int tmp[10];
int RT[maxn*maxn];



void DFS(int x,int y)
{
    Map[x][y]=Block; TT++;
    for(int i=0;i<4;i++)
    {
        int NewX=x+dir[i][0];
        int NewY=y+dir[i][1];
        if(NewX>=0&&NewX<=n-1)
            if(NewY>=0&&NewY<=m-1)
                if(Map[NewX][NewY]==0)
                    DFS(NewX,NewY);
    }
}

int P(int x,int y)
{
    if(x>=0&&x<=n-1)
        if(y>=0&&y<=m-1)
            return 1;
    return 0;
}

int main()
{
    dir[0][0]=1;dir[0][1]=0;
    dir[1][0]=0;dir[1][1]=1;
    dir[2][0]=-1;dir[2][1]=0;
    dir[3][0]=0;dir[3][1]=-1;

    scanf("%d%d",&n,&m);
    memset(Map,0,sizeof Map);
    for(int i=0;i<n;i++) scanf("%s",s[i]);
    Block=1;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            if(s[i][j]=='*') Map[i][j]=-1;
            else Map[i][j]=0;
        }

    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            if(Map[i][j]==0)
            {
                TT=0;
                DFS(i,j);
                tot[Block]=TT;
                Block++;
            }
        }

    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(s[i][j]=='*')
            {
                int ans=0;
                int tmp[10],xx=0;
                if(P(i-1,j)) tmp[xx++]=Map[i-1][j];
                if(P(i+1,j)) tmp[xx++]=Map[i+1][j];
                if(P(i,j-1)) tmp[xx++]=Map[i][j-1];
                if(P(i,j+1)) tmp[xx++]=Map[i][j+1];
                for(int r=0;r<xx;r++)
                {
                    int fail=0;
                    for(int d=0;d<r;d++) if(tmp[r]==tmp[d]) fail=1;
                    if(!fail) ans=ans+tot[tmp[r]];
                }
                ans++;
                ans=ans%10;
                s[i][j]=ans+'0';
            }
        }
    }

    for(int i=0;i<n;i++) printf("%s\n",s[i]);
    return 0;
}

 

posted @ 2016-01-14 14:57  Fighting_Heart  阅读(249)  评论(0编辑  收藏  举报