• T


    题意:

    输入n行数,没行由2*n个数,表示一个坐标(x,y)。

    如果x和y==-1表示从该点(i,j)出发,按照构造的前移动不会停下。

    否则就要到点(x,y)处停下。

    题解:

    首先处理-1  枚举每个-1的坐标,判断四个方向是否存在-1的情况。如果不存在就可以结束了,否则就将移动方向保存到棋盘中。

    然后处理x    如果(i,j)=(x,y),说明此处(i,j)一定时x。注意,如果输入了非-1的数据,那么只少要存在一个x。

    然后从每个x出发,dfs向四个方向跑, 注意可以跑的前提时这四个方向必须是要到x。

    最后如果有某个点没有枚举到,那么也没有答案。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2000+7;
    char ans[N][N];
    struct stu {
        int a,b;
    }mp[N][N];
    bool flag=-1;
    int n;
    int d[4][2]={1,0,0,1,-1,0,0,-1};
    void dfs(int x,int y,int x1,int y1){
        for(int i=0;i<4;i++){
            int dx=x+d[i][0];
            int dy=y+d[i][1];
            if(dx>=1&&dy>=1&&dx<=n&&dy<=n&&mp[dx][dy].a==x1&&mp[dx][dy].b==y1&&ans[dx][dy]=='0'){
                if(i==0) {
                    ans[dx][dy]='U';
                    dfs(dx,dy,x1,y1);
                }
                else if(i==1){
                    ans[dx][dy]='L';
                    dfs(dx,dy,x1,y1);
                }
                else if(i==2){
                    ans[dx][dy]='D';
                    dfs(dx,dy,x1,y1);
                }
                else {
                    ans[dx][dy]='R';
                    dfs(dx,dy,x1,y1);
                }
            }
        }
    }
    bool judge(int i,int j)
    {
        if(i+1<=n&&mp[i+1][j].a==-1) {
            ans[i][j]='D';
            return true;
        }
        else if(j+1<=n&&mp[i][j+1].a==-1){
            ans[i][j]='R';
            return true;
        }
        else if(i-1>=1&&mp[i-1][j].a==-1){
            ans[i][j]='U';
            return true;
        }
        else if(j-1>=1&&mp[i][j-1].a==-1){
            ans[i][j]='L';
            return true;
        }
        else return false; 
    }
    int main()
    {
        ios::sync_with_stdio(0);
        cin>>n;
        int cnt=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                int x,y;
                cin>>x>>y;
                if(x!=-1) cnt++;
                mp[i][j]={x,y};    
                ans[i][j]='0';
            }
        }  
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){
                if(mp[i][j].a==-1){
                    if(!judge(i,j)){
                        cout<<"INVALID"<<endl;
                        return 0;
                    }
                }
            } 
        int sum=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(mp[i][j].a==i&&mp[i][j].b==j){
                    ans[i][j]='X';
                    sum++;
                }
            }
        }
        if(cnt!=0&&sum==0){
            cout<<"INVALID"<<endl;
            return 0;
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(ans[i][j]=='X'){
                    dfs(i,j,i,j);
                }
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(ans[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<<ans[i][j];
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    OpenStack 数据库操作 demo
    python 实现获取电脑IP、主机名、Mac地址
    openvswitch BFD 简介
    Python 获取主机名
    OpenvSwitch完全使用手册
    ovs datapath笔记
    openstack 实用命令
    表示数值的字符串 牛客网 剑指Offer
    反转单词顺序列 牛客网 剑指Offer
    第一个只出现一次字符的位置 牛客网 剑指Offer
  • 原文地址:https://www.cnblogs.com/Accepting/p/12458609.html
Copyright © 2020-2023  润新知