下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可以通行的地方。
010000
000100
001001
110000
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这个它的上、下、左、右四个方向之一。对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫,一共 10 步。其中 D、 U、 L、 R 分别表示向下、向上、向左、向右走。对于下面这个更复杂的迷宫(30 行 50 列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。请注意在字典序中D<L<R<U。
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
struct node
{
int x, y;
string path;
};
int g[N][N]; //记录地图
int vis[N][N]; //标记数字,0表示没走过,1表示走过
queue<node> q;
int dx[4] ={1,0,0,-1},dy[4] = {0,-1,1,0}; //D<L<R<U
char dir[4] = {'D','L','R','U'};
void bfs()
{
node now;
now.x = 0,now.y = 0;
q.push(now);
vis[0][0] =1;
while(q.size())
{
node t = q.front();
if (t.x==29 && t.y ==49 )
{
cout <<t.path<<endl;
return;
}
for(int i = 0 ; i < 4 ; i++)
{
node tt;
tt.x = t.x + dx[i], tt.y = t.y +dy[i], tt.path = t.path + dir[i];
if (tt.x >=0 && tt.x < 30 && tt.y >= 0 && tt.y <50 && g[tt.x][tt.y]==0 &&
vis[tt.x][tt.y]==0)
{
vis[tt.x][tt.y] = 1;
q.push(tt);
}
}
q.pop();
}
}
int main()
{
string s;
for (int i = 0 ; i < 30 ; i ++)
{
cin >> s; //读入30行字符串
for (int j = 0 ; j < 50 ; j ++)
{
g[i][j] = s[j] -'0'; //将字符串转换成int数组
}
}
bfs();
return 0;
}