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