思路:广搜找最短路,然后深搜找路径
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define pb push_back
#define pf push_front
#define pob pop_back
#define pof pop_front
#define pii pair<int,int>
#define pli pair<ll,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define fi first
#define se second
#define rep(k,l,r) for(int (k)=(l);k<=(r);++k)
using namespace std;
inline ll read(){
ll k=0,flag=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')flag=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
k=(k<<1)+(k<<3)+(c^48);
c=getchar();
}
return k*flag;
}
void print(ll x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9)print(x/10);
putchar(x%10+'0');
return ;
}
const int N=2e3+10;
int n,m,ans,fa[N][N][2];
bool a[N][N],flag;
const int dx[]={1,-1,0,0};
const int dy[]={0,0,1,-1};
bool vis[N][N];
struct node{
int x,y,step;
bool op;
};queue<node>q;
void dfs(int x,int y,int dep,bool op,int xx,int yy){
if(flag||dep>ans||x<1||x>n||y<1||y>m||vis[x][y]||!op^a[x][y])return ;
vis[x][y]=1;
fa[x][y][0]=xx;
fa[x][y][1]=yy;
if(x==n&&y==m){
int nx=x,ny=y;
string s="";
while(fa[nx][ny][0]){
if(fa[nx][ny][0]==nx-1)s+='D';
else if(fa[nx][ny][0]==nx+1)s+='U';
else if(fa[nx][ny][1]==ny-1)s+='R';
else s+='L';
int nxx=nx,nyy=ny;
nx=fa[nxx][nyy][0];
ny=fa[nxx][nyy][1];
}
reverse(s.begin(),s.end());
cout<<s<<"\n";
flag=1;
return ;
}
rep(i,0,3)dfs(x+dx[i],y+dy[i],dep+1,a[x][y],x,y);
return ;
}
void solve(){
n=read(),m=read();
rep(i,1,n){
rep(j,1,m){
char c;
cin>>c;
a[i][j]=c-'0';
vis[i][j]=0;
}
}
bool ok=0;
vis[1][1]=1;
q.push({1,1,0,a[1][1]});
while(q.size()){
node now=q.front();
q.pop();
if(now.x==n&&now.y==m){
ans=now.step;
ok=1;
while(q.size())q.pop();
break;
}
rep(i,0,3){
int xx=now.x+dx[i];
int yy=now.y+dy[i];
if(xx<1||xx>n||yy<1||yy>m||vis[xx][yy]||!now.op^a[xx][yy])continue;
vis[xx][yy]=1;
q.push({xx,yy,now.step+1,a[xx][yy]});
}
}
if(!ok){
puts("-1");
return ;
}
print(ans);
puts("");
rep(i,1,n)rep(j,1,m)vis[i][j]=0;
flag=0;
dfs(1,1,0,!a[1][1],0,0);
rep(i,1,n)rep(j,1,m)vis[i][j]=fa[i][j][0]=fa[i][j][1]=0;
return ;
}
int main(){
int T=read();
while(T--)solve();
return 0;
}