总结
一碰到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;
}