1 //求从(sx.sy)到(gx.gy)的最短距离;
2
3 #include<iostream>
4 #include<cstdio>
5 #include<cstdio>
6 #include<queue>
7 #include<cstring>
8 #define INF 99999999
9
10 using namespace std;
11
12 typedef pair<int, int > P; //数对,记录位置
13 int n,m,cur;//规模大小
14 int sx,sy;//起点坐标
15 int gx,gy;//终点坐标
16 int dis[501][501];///到各个位置的最短距离的数组;
17 int maze[501][501];//表示迷宫
18 int dx[4]={1,0,-1,0}; // 四个方向的向量
19 int dy[4]={0,1,0,-1}; //四个方向的向量
20 struct node{
21 int x,y;
22 }pre[501][501]; //记录前驱
23
24
25 int bfs() //广度搜索
26 {
27 queue<P> que;
28 for(int i=1;i<=n;i++)
29 for(int j=1;j<=m;j++)
30 dis[i][j]=INF;
31 que.push(P(1,1));//将起点加入队列
32 dis[1][1]=0; //加进队列距离有了,代表访问了
33
34 //不断循环直到队列的长度为0
35 while(que.size())
36 {
37 P p=que.front(); que.pop();
38 if(p.first==n&&p.second==m)
39 break;
40 for(int i=0;i<4;i++) //四个方向访问
41 {
42 int nx=p.first+dx[i],ny=p.second+dy[i]; //代表即将访问的点
43
44 if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&maze[nx][ny]==0&&dis[nx][ny]==INF)
45 {
46 que.push(P(nx,ny)); dis[nx][ny]=dis[p.first][p.second]+1; //符合条件加入队列
47 pre[nx][ny].x=p.first; pre[nx][ny].y=p.second; //记录前驱
48 }
49
50 }
51 }
52 return dis[n][m];
53
54 }
55 void print_road(int x,int y) //写出前驱
56 {
57 if(pre[x][y].x==-1)
58 return ;
59 print_road(pre[x][y].x,pre[x][y].y);
60 if(x==pre[x][y].x&&y>pre[x][y].y)
61 printf("R");
62 else if(x>pre[x][y].x&&y==pre[x][y].y)
63 printf("D");
64 else if(x<pre[x][y].x&&y==pre[x][y].y)
65 printf("U");
66 else if(x==pre[x][y].x&&y<pre[x][y].y)
67 printf("L");
68 }
69 int main()
70 {
71 //int n,m;
72 while(~scanf("%d%d",&n,&m))
73 {
74 pre[1][1].x=pre[1][1].y=-1;
75 for(int i=1;i<=n;i++)
76 for(int j=1;j<=m;j++)
77 scanf("%1d",&maze[i][j]);
78 cur=bfs();
79 printf("%d\n",cur);
80 print_road(n,m); //打印路径
81 }
82 }