路径查询写的有点麻烦;可以直接用结构体,记录前一个路径;
思想就是,走迷宫,最少路径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]; }