题目描述
下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方。
010000
000100
001001
110000
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。 对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫, 一共 10 步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(30 行 50 列),请找出一种通过迷宫的方式, 其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。 请注意在字典序中D<L<R<U。
测试样例
4 6
010000
000100
001001
110000
DRRURRDDDR
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int nextt[4][2]={{1,0},{0,-1},{0,1},{-1,0}};//字典序广搜
char path[4]={'D','L','R','U'};
int maze[100][100];
int book[100][100];
struct node{
int x, y, step, pre;
char ch; //代表它来的方式,一号点没有来的方式
}q[10000];
void getpath(int t)//回溯输出
{
if(t==1)//一号点没有来的方式
return;
getpath(q[t].pre);
printf("%c", q[t].ch);
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
scanf("%1d", &maze[i][j]);
int head=1, tail=1;
q[tail].x=0;
q[tail].y=0;
q[tail].step=0;
q[tail].pre=-1;
tail++;
book[0][0]=1;
int flag=0;
while(head<tail){
for(int k=0; k<4; k++){
int tx=q[head].x+nextt[k][0];
int ty=q[head].y+nextt[k][1];
if(tx<0||tx>=n||ty<0||ty>=m||book[tx][ty]||maze[tx][ty]==1)
continue;
book[tx][ty]=1;
q[tail].x=tx;
q[tail].y=ty;
q[tail].pre=head;
q[tail].step=q[head].step+1;
q[tail].ch=path[k];
tail++;
if(tx==n-1&&ty==m-1){
flag=1;
break;
}
}
if(flag==1)
break;
head++;
}
getpath(tail-1);
return 0;
}