题目地址:http://tzcoder.cn/acmhome/problemdetail.do?method=showdetail&id=7342
视频讲解地址:【迷宫(第十届蓝桥杯)——杂题选讲(BFS)】https://www.bilibili.com/video/BV1sY411B7c4?vd_source=2c6f0c5d33eca0d75d8c3ceb6375eb3e
题目描述:
tips:在第十届蓝桥杯中本题以填空题的形式出现
描述
下图给出了一个迷宫的平面图,其中标记为1 的为障碍,标记为0 的为可
以通行的地方。
010000
000100
001001
110000
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这
个它的上、下、左、右四个方向之一。
对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫,
一共10 步。其中D、U、L、R 分别表示向下、向上、向左、向右走。
输入
第一行为n和m(2<=n, m<=100),表示迷宫的行数和列数。
接下来有n行,每行由m个0或1组成。
输出
在步数最少的前提下,请找出字典序最小的一个作为答案(数据保证一定有答案)。
请注意在字典序中D<L<R<U。
样例输入
4 6
010000
000100
001001
110000
样例输出
DRRURRDDDR
源代码
//作者:Baicheng Qu
//BFS+字符串
//TZOJ 7342
#include<bits/stdc++.h>
using namespace std;
#define maxn 50
char maze[maxn][maxn];
char d[4]={'D','L','R','U'};//注意,这里要按照字典序顺序排
int dir[4][2]={{1,0},{0,-1},{0,1},{-1,0}};//这里的顺序要和上面d数组一一对应
int n,m;
struct node
{
int x;
int y;
string s;
/* data */
};
void bfs()
{
node now,next;
queue<node> que;
maze[0][0]='1';
now.s="";
now.x=now.y=0;
que.push(now);
while(!que.empty())
{
now=que.front();
que.pop();
if(now.x==n-1&&now.y==m-1)
{
cout<<now.s<<endl;
}
for(int i=0;i<4;i++)
{
next.x=now.x+dir[i][0];
next.y=now.y+dir[i][1];
if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&maze[next.x][next.y]=='0')
{
maze[next.x][next.y]='1';
next.s=now.s+d[i];
que.push(next);
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>maze[i][j];
}
}
bfs();
return 0;
}