题意:
输入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; }