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;
}
原文地址:https://www.cnblogs.com/Accepting/p/12458609.html