Description

牛牛周末去了游乐园走迷宫。这是一个n*m大小的01迷宫,0表示这个位置可以走,1表示有障碍物不能。
走。现在牛牛在起点(1,1),他想要走到终点(n,m)。并且,如果他能够走到终点的话,他想要知道自己是怎么走到终点的。
如果可以走到终点,因为牛牛比较懒他会先保证走的步数最少,又因为牛牛是个追求完美的人,如果有多
条路径步数一样,他会选择走字典序最小的那条。
数据保证起点和终点都是0

Solution

最短路+字典序最小,非常经典的bfs题目,值得注意的是我们bfs的时候顺序应该按照题意要求的,
分别是DLRU去做,这样最先到达终点的点一定是最短且字典序最小的。
因此只需要做一遍bfs即可。

Code

#include<bits/stdc++.h>
typedef long long ll;
const int N = 1e6 + 5;
using namespace std;
char maze[505][505];
struct node {
  int x, y;
  int step;
  string ans;
  node(int _x = 0, int _y = 0, int _step = 0, string _ans = ""): x(_x), y(_y), step(_step), ans(_ans){}
};
int n, m;
bool vis[505][505];
int dist[4][2] = {1, 0, 0, -1, 0, 1, -1, 0};
string p = "DLRU";
void bfs(int x, int y) {
  queue<node> q;
  q.push(node(x, y, 0, ""));
  vis[x][y] = 1;
  while(!q.empty()) {
    node now = q.front();
    q.pop();
    //cout << now.x << ' ' << now.y << "\n";
    if(now.x == n && now.y == m) {
      cout << now.step << "\n";
      cout << now.ans << "\n";
      return ;
    }
    for(int i = 0; i < 4; i++) {
      int xx = now.x + dist[i][0];
      int yy = now.y + dist[i][1];
      //cout << xx << ' ' << yy << "\n";
      if(!vis[xx][yy] && maze[xx][yy] == '0' && xx <= n && xx >= 1 && yy >= 1 && yy <= m) {
        vis[xx][yy] = 1;
        q.push(node(xx, yy, now.step + 1, now.ans + p[i]));
      }
    }
  }
  cout << -1 << "\n";
}
int main() {
  ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  cin >> n >> m;
  for(int i = 1; i <= n; i++) {
    for(int j = 1; j <= m; j++)  cin >> maze[i][j];
  }
  bfs(1, 1);
  return 0;
}