#include<cstdio>
#include<queue>
#include<iostream>
using namespace std;
struct Node{
int x,y;
int step;
}pre[501][501];
int ans = 0;
int a[501][501];
int v[501][501]={0};
int n,m;
int dir[4][2]={1,0,0,1,-1,0,0,-1};
bool check(int x,int y)
{
if(x<1 || x>n || y<1 || y>m || a[x][y] || v[x][y])
return false;
return true;
}
void bfs(int bx,int by)
{
queue<Node> Q;
Node p;
Node next;
p.x = bx;
p.y = by;
p.step = 0;
v[bx][by] = 1;
Q.push(p);
while(!Q.empty()){
p = Q.front();
Q.pop();
for(int i=0;i<4;i++){
next = p;
next.x += dir[i][0];
next.y += dir[i][1];
next.step += 1;
if(next.x == n && next.y == m){
ans = next.step;
pre[next.x][next.y].x = p.x;
pre[next.x][next.y].y = p.y;
return ;
}
if(check(next.x ,next.y)){
Q.push(next);
pre[next.x][next.y].x = p.x;
pre[next.x][next.y].y = p.y;
v[next.x][next.y] = 1;
}
}
}
ans = -1;
}
void print_road(int x,int y)
{
if(pre[x][y].x == -1)
return ;
print_road(pre[x][y].x,pre[x][y].y);
//printf("%d %d %d %d\n",x,y,pre[x][y].x,pre[x][y].y);
if(x == pre[x][y].x && y > pre[x][y].y)
printf("R");
else if(x > pre[x][y].x && y == pre[x][y].y)
printf("D");
else if(x < pre[x][y].x && y == pre[x][y].y)
printf("U");
else if(x == pre[x][y].x && y < pre[x][y].y)
printf("L");
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%1d",&a[i][j]);
pre[1][1].x = pre[1][1].y = -1;
bfs(1,1);
printf("%d\n",ans);
print_road(n,m);
return 0;
}
经典BFS求最短路径 + 记录路径
题目连接:点击打开链接