题目描述
下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方。
010000
000100
001001
110000
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。 对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫, 一共 10 步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(30 行 50 列),请找出一种通过迷宫的方式, 其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。 请注意在字典序中D<L<R<U。(如果你把以下文字复制到文本文件中,请务 必检查复制的内容是否与文档中的一致。在试题目录下有一个文件 maze.txt, 内容与下面的文本相同)
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个字符串,包含四种字母 D、U、L、R,在提交答案时只填写这个字符串,填 写多余的内容将无法得分。
这个题并没有什么难的。
我这里写的是题意的那个例子。
答案与题意一致。
代码如下:
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
char map[10][10];
int color[10][10]={0};
const int vx[4]={1,0,0,-1};
const int vy[4]={0,-1,1,0};
struct point {
int x;
int y;
vector<char> a;
};
int main(){
void bfs(point s);
point s;
s.x=0;
s.y=0;
for(int i=0;i<4;i++)
for(int j=0;j<6;j++)
cin >> map[i][j];
bfs(s);
return 0;
}
void bfs(point s){
queue<point> u;
u.push(s);
color[0][0]=1;
int flag=0;
while(!u.empty()){
point now=u.front();
u.pop();
if(now.x==3 && now.y==5){
now.a.push_back('R');
for(int i=0;i<now.a.size();i++)
cout << now.a[i] ;
cout << endl;
return ;
}
for(int i=0;i<4;i++){
point next;
next.x=now.x+vx[i];
next.y=now.y+vy[i];
for(int j=0;j<now.a.size();j++)
next.a.push_back(now.a[j]);
if(i==0)
next.a.push_back('D');
else if(i==1)
next.a.push_back('L');
else if(i==2)
next.a.push_back('R');
else if(i==3)
next.a.push_back('U');
if(next.x>=0 && next.x<4 && next.y>=0 && next.y<6 && !color[next.x][next.y] && map[next.x][next.y]!='1'){
u.push(next);
color[next.x][next.y]=1;
}
}
}
}