ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[CF1316D] Nash Matrix - DFS

2020-03-11 09:01:11  阅读:257  来源: 互联网

标签:jj int CF1316D DFS ii dfs2 dfs1 && Nash


对一个 \(n\times n\) 的棋盘,每个格子上有一个字母,表示遇到这个格子就向着某个方向走或者停止。现在给定从每个位置开始会走到的位置,或者死循环,试构造一个合法的棋盘,或者输出 INVALID。

Solution

除去死循环的部分,终点相同的点会形成独立的联通块,我们从终点开始反向 DFS 即可

如果死循环是单独的一个点,则 INVALID

否则,我们强行构造出一个二元环,然后当做第一种情况做即可

#include <bits/stdc++.h>
using namespace std;

const int N = 1005;

char a[N][N];
int n,x[N][N],y[N][N];

void dfs1(int i,int j,int ii,int jj) {
    if(x[i-1][j]==ii && y[i-1][j]==jj && a[i-1][j]==0) {
        a[i-1][j]='D';
        dfs1(i-1,j,ii,jj);
    }
    if(x[i+1][j]==ii && y[i+1][j]==jj && a[i+1][j]==0) {
        a[i+1][j]='U';
        dfs1(i+1,j,ii,jj);
    }
    if(x[i][j-1]==ii && y[i][j-1]==jj && a[i][j-1]==0) {
        a[i][j-1]='R';
        dfs1(i,j-1,ii,jj);
    }
    if(x[i][j+1]==ii && y[i][j+1]==jj && a[i][j+1]==0) {
        a[i][j+1]='L';
        dfs1(i,j+1,ii,jj);
    }
}

void dfs2(int i,int j) {
    if(x[i-1][j]==-1 && a[i-1][j]==0) {
        a[i-1][j]='D';
        dfs2(i-1,j);
    }
    if(x[i+1][j]==-1 && a[i+1][j]==0) {
        a[i+1][j]='U';
        dfs2(i+1,j);
    }
    if(x[i][j-1]==-1 && a[i][j-1]==0) {
        a[i][j-1]='R';
        dfs2(i,j-1);
    }
    if(x[i][j+1]==-1 && a[i][j+1]==0) {
        a[i][j+1]='L';
        dfs2(i,j+1);
    }
}

signed main() {
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) {
            cin>>x[i][j]>>y[i][j];
        }
    }
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) {
            if(i==x[i][j] && j==y[i][j]) {
                dfs1(i,j,i,j);
                a[i][j]='X';
            }
        }
    }
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) {
            if(x[i][j]==-1 && a[i][j]==0) {
                if(x[i][j+1]!=-1&&x[i][j-1]!=-1&&x[i-1][j]!=-1&&x[i+1][j]!=-1) {
                    cout<<"INVALID"<<endl;
                    return 0;
                }
                else if(x[i][j+1]==-1) {
                    dfs1(i,j+1,-1,-1);
                    a[i][j+1]='L';
                    dfs1(i,j,-1,-1);
                    a[i][j]='R';
                }
                else if(x[i][j-1]==-1) {
                    dfs1(i,j-1,-1,-1);
                    a[i][j-1]='R';
                    dfs1(i,j,-1,-1);
                    a[i][j]='L';
                }
                else if(x[i-1][j]==-1) {
                    dfs1(i-1,j,-1,-1);
                    a[i-1][j]='D';
                    dfs1(i,j,-1,-1);
                    a[i][j]='U';
                }
                else if(x[i+1][j]==-1) {
                    dfs1(i+1,j,-1,-1);
                    a[i+1][j]='U';
                    dfs1(i,j,-1,-1);
                    a[i][j]='D';
                }
            }
        }
    }
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) {
            if(a[i][j]==0) {
                cout<<"INVALID"<<endl;
                return 0;
            }
        }
    }
    cout<<"VALID"<<endl;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) cout<<a[i][j];
        cout<<endl;
    }
}

标签:jj,int,CF1316D,DFS,ii,dfs2,dfs1,&&,Nash
来源: https://www.cnblogs.com/mollnn/p/12460280.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有