题目链接:传送门(点我)
思路:维护一个前驱表,也可以在每个节点上维护路径
AC代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
char mp[550][550];
string dir="DLRU";//!min_direction:DLRU
int xx[4]={1,0,0,-1},yy[4]={0,-1,1,0},pre[550][550];
struct pos{
int x,y,step;
}st,en;//start end
queue<pos>q;
void find_path(int x,int y){
if(x==1&&y==1)return ;
find_path(x-xx[pre[x][y]],y-yy[pre[x][y]]);
cout<<dir[pre[x][y]];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>mp[i][j];
st.x=1;st.y=1;st.step=0;//start
en.x=n;en.y=m;en.step=-1;//end
q.push(st);
mp[st.x][st.y]='1';
while(q.size()!=0){
pos t = q.front();
q.pop();
if(t.x==en.x&&t.y==en.y){en.step=t.step;break;}
for(int i=0;i<4;i++){
pos z;
z.x=t.x+xx[i];z.y=t.y+yy[i];z.step=t.step+1;
if(z.x<1||z.x>n||z.y<1||z.y>m||mp[z.x][z.y]=='1')continue;
pre[z.x][z.y]=i;mp[z.x][z.y]='1';
q.push(z);
}
}
cout<<en.step<<endl;
find_path(n,m);
return 0;
}