D. Nash Matrix-(DFS+构造)

总结

一碰到DFS就觉的麻烦,这里考虑,哪也考虑,自己考虑的还是麻烦的一批的方法,弄得回路得方法超级超级麻烦,自己写得都要吐血,要是为了上点分,打死都不碰它。看了别人得方法,确实很巧。

解析

情况1:回路问题,只有两个满足-1放个方格,两个自我循环就好,其他只要挨着他们往他们靠就行
情况2:从end点DFS就行

题目链接

#include<bits/stdc++.h>
//typedef long long ll;
//#define ull       unsigned long long
#define int       long long
#define F           first
#define S           second
#define endl        "\n"//<<flush
#define eps         1e-6
#define lowbit(x)   (x&(-x))
#define PI          acos(-1.0)
#define inf         0x3f3f3f3f
#define MAXN        0x7fffffff
#define INF         0x3f3f3f3f3f3f3f3f
#define pa          pair<int,int>
#define ferma(a,b)  pow(a,b-2)
#define pb          push_back
#define all(x)      x.begin(),x.end()
#define memset(a,b) memset(a,b,sizeof(a));
#define IOS         ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
void file()
{
#ifdef ONLINE_JUDGE
#else
    freopen("cin.txt","r",stdin);
    //  freopen("cout.txt","w",stdout);
#endif
}
const int N=1e3+5;
char G[N][N];
int flag=1,F[N][N],S[N][N];
bool connection(int x,int y,int n,int m,char a,char b)
{
    if(F[n][m]==-1)
    {
        G[x][y]=a;
        if(!G[n][m])
            G[n][m]=b;
        return false;
    }
    else
        return true;
}
void dfs(int x,int y,char a)
{
    if(G[x][y])
        return ;
    G[x][y]=a;
    if(F[x+1][y]==F[x][y]&&S[x+1][y]==S[x][y])
        dfs(x+1,y,'U');
    if(F[x-1][y]==F[x][y]&&S[x-1][y]==S[x][y])
        dfs(x-1,y,'D');
    if(F[x][y+1]==F[x][y]&&S[x][y+1]==S[x][y])
        dfs(x,y+1,'L');
    if(F[x][y-1]==F[x][y]&&S[x][y-1]==S[x][y])
        dfs(x,y-1,'R');
}
signed main()
{
    IOS;
    //file();
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            cin>>F[i][j]>>S[i][j];
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            if(F[i][j]==-1)
            {
                bool temp=(!G[i][j]);
                if(temp)
                    temp=connection(i,j,i+1,j,'D','U');
                if(temp)
                    temp=connection(i,j,i-1,j,'U','D');
                if(temp)
                    temp=connection(i,j,i,j-1,'L','R');
                if(temp)
                    temp=connection(i,j,i,j+1,'R','L');
                if(temp)
                    flag=0;
            }
            else if(i==F[i][j]&&j==S[i][j])
                dfs(i,j,'X');
        }
    }
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            if(!G[i][j])
                flag=false;
    if(!flag)
    {
        cout<<"INVALID"<<endl;
        return 0;
    }
    cout<<"VALID"<<endl;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            cout<<G[i][j];
        }
        cout<<endl;
    }
    return 0;
}

发布了149 篇原创文章 · 获赞 5 · 访问量 6891

猜你喜欢

转载自blog.csdn.net/weixin_44224825/article/details/104680551