CodeCraft-20 (Div. 2) D. Nash Matrix

CodeCraft-20 (Div. 2) D. Nash Matrix

原题链接:https://codeforces.com/contest/1316/problem/D

走到自己位置上的一定是'X',然后同一路径上的目的地一定一样,可以从每个‘X’开始把同一目的地的都搜过去,处理出来,然后-1的情况就是反着来,所有联通的-1构成一个死循环就好了,如果最后发现有没有被处理到的,说明无法构造出来。

注意上下左右方向的判断很恶心,昨晚wa了3发才过....罚时爆炸。

代码

//#pragma GCC optimize(3)
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
typedef pair<int,int> pp;
const int N=1e3+5;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const double pi=acos(-1);
const double eps=1e-6;
mt19937 rnd(time(0));
pp g[N][N];
int vis[N][N];
char ans[N][N];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1};
char d[4]={'U','D','R','L'};
char fd[4]={'D','U','L','R'};
void dfs(int x,int y)
{
    for(int i=0;i<4;i++){
        int xx=x+dx[i];
        int yy=y+dy[i];
        if(vis[xx][yy])continue;
        if(g[x][y].first==g[xx][yy].first&&g[x][y].second==g[xx][yy].second)
        {
            ans[xx][yy]=d[i];
            vis[xx][yy]=1;
            dfs(xx,yy);
        }
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            int x,y;
            scanf("%d%d",&x,&y);
            g[i][j]={x,y};
            if(x==i&&y==j)ans[x][y]='X',vis[x][y]=1;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(g[i][j].first==-1){
                for(int k=0;k<4;k++){
                    int x=i,y=j;
                    int xx=x+dx[k];
                    int yy=y+dy[k];
                    if(g[x][y].first==g[xx][yy].first&&g[x][y].second==g[xx][yy].second)
                    {
                        ans[x][y]=fd[k];
                        vis[x][y]=1;
                        break;
                    }
                }
            }
            else {
                if(ans[i][j]=='X')dfs(i,j);
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(!vis[i][j]){
                printf("INVALID
");
                return 0;
            }
        }
    }
    printf("VALID
");
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            printf("%c",ans[i][j]);
        }puts("");
    }
    return 0;
}


原文地址:https://www.cnblogs.com/liuquanxu/p/12419551.html