The Labyrinth

Posted kasenbob

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The Labyrinth相关的知识,希望对你有一定的参考价值。

题目链接:The Labyrinth

思路:

若对每次询问都进行一次搜索会超时,因此思路是先将每个空格子最多联通几个空格子记录起来,对于每次询问,只需查询上下左右空格的总联通数量即可

代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <map>
#include <set>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;

const int maxn=1000+5;
int vis[maxn][maxn];
char mp[maxn][maxn];
int n,m;
int dx[]= {0,1,0,-1};
int dy[]= {1,0,-1,0};

struct Node
{
    int x,y;
};
queue<Node> Q;
map<int,int> M;
set<int> S;
set<int>::iterator it;

bool check(int x,int y)
{
    if(x<0||x>=n||y<0||y>=m)
        return false;
    if(vis[x][y])
        return false;
    if(mp[x][y]!=.)
        return false;
    return true;
}

void BFS(int x1,int y1,int cnt)
{
    vis[x1][y1]=cnt;
    int ans=0;
    Q.push((Node)
    {
        x1,y1
    });
    while(!Q.empty())
    {
        ans++;
        Node &u=Q.front();
        Q.pop();
        for(int i=0; i<4; i++)
        {
            int x=u.x+dx[i];
            int y=u.y+dy[i];
            if(check(x,y))
            {
                vis[x][y]=cnt;
                Q.push(Node{x,y});
            }
        }
    }
    M[cnt]=ans;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0; i<n; i++)
        scanf("%s",mp[i]);

    mem(vis,0);
    int cnt=1;
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            if(mp[i][j]==.&&vis[i][j]==0)
            {
                BFS(i,j,cnt++);
            }

    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
        {
            if(mp[i][j]==*)
            {
                S.clear();

                if(i>0)
                    S.insert(vis[i-1][j]);
                if(i<n-1)
                    S.insert(vis[i+1][j]);
                if(j>0)
                    S.insert(vis[i][j-1]);
                if(j<m-1)
                    S.insert(vis[i][j+1]);
                int res=1;
                for(it=S.begin();it!=S.end();it++)
                    res+=M[*it];
                mp[i][j]=char(0+res%10);
            }
        }
    for(int i=0; i<n; i++)
    {
        printf("%s\n",mp[i]);
    }

    return 0;
}

 

以上是关于The Labyrinth的主要内容,如果未能解决你的问题,请参考以下文章

题解 CF1063B Labyrinth

Codeforces 1064 D - Labyrinth

非原创codeforces 1063B Labyrinth 01bfs

环境初始化 Build and Install the Apache Thrift IDL Compiler Install the Platform Development Tools(代码片段

maven web项目的web.xml报错The markup in the document following the root element must be well-formed.(代码片段

Codeforces Round #516 Div2 D. Labyrinth