路径查询写的有点麻烦;可以直接用结构体,记录前一个路径;
思想就是,走迷宫,最少路径bfs;
字典序最小,按照D L R U的顺序遍历就行了

#include<bits/stdc++.h>
using namespace std;
int vis[251000];
char mp[1010][1010],a[251000];
int pre[1010][1010];
int n,m,t;
int d[4][2]={{1,0},{0,-1},{0,1},{-1,0}};
int bfs(int s)
{
    queue<int> q;
    q.push(s);
    vis[s]=0;
    while(!q.empty())
    {
        int k=q.front();q.pop();
        int x=k/m,y=k%m;
        if(k==t) return 0;
        for(int i=0;i<4;i++)
        {
            int dx=x+d[i][0],dy=y+d[i][1];
            if(dx<0||dy<0||dx>=n||dy>=m) continue;
            if(mp[dx][dy]=='1'||vis[dx*m+dy]!=-1) continue;
            vis[dx*m+dy]=vis[x*m+y]+1;
            pre[dx][dy]=x*m+y;
            q.push(dx*m+dy);
        }
    }
}
int main()
{
    cin>>n>>m;
    memset(vis,-1,sizeof(vis));
    for(int i=0;i<n;i++)
    {
        cin>>mp[i];
    }
    t=(n-1)*m+(m-1);
    bfs(0);
    cout<<vis[t]<<endl;
    int x=n-1,y=m-1,h=0;
   while(pre[x][y])
   {
       int k=pre[x][y];
       int dx=k/m,dy=k%m;
       if((dx+1)==x&&dy==y) a[++h]='D';
       if((dx-1)==x&&dy==y) a[++h]='U';
       if(dx==x&&(dy+1)==y) a[++h]='R';
       if(dx==x&&(dy-1)==y) a[++h]='L';
       x=dx,y=dy;
   }
   int dx=0,dy=0;
       if((dx+1)==x&&dy==y) a[++h]='D';
       if((dx-1)==x&&dy==y) a[++h]='U';
       if(dx==x&&(dy+1)==y) a[++h]='R';
       if(dx==x&&(dy-1)==y) a[++h]='L';
    for(int i=h;i>=1;i--)
        cout<<a[i];
}