迷宫
下图给出了一个迷宫的平面图,其中标记为1的为障碍,标记为0的为可以通行的地方。
010000
000100
001001
110000
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这个它的上、下、左、右四个方向之一。
对于上面的迷宫,从入口开始,可以按DRRURRDDDR的顺序通过迷宫,一共 10 步。
其中 D、 U、 L、 R 分别表示向下、向上、向左、向右走。
对于一个n行m列的迷宫(n≤30,m≤50),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。
请注意在字典序中D<L<R<U。
输入格式:
第一行两个整数n和m,分别表示迷宫的行数和列数。
接下来n行,每行由长度为m的01串组成。
输出格式:
一个字符串。
输入样例:
4 6
010000
000100
001001
110000
输出样例:
DRRURRDDDR
解题
非常简单的一道广搜题,只需要把四方向的顺序按照字典序排一下,每次走动记录方向就可以了,直接贴代码吧
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
char mp[55][55];
int dt[4][2] = {1, 0, 0, -1, 0, 1, -1, 0};
string d = "DLRU";
int vis[55][55];
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> mp[i][j];
}
}
typedef pair<pair<int, int>, string> P;
queue<P> p;
p.push({{0, 0}, ""});
vis[0][0] = 1;
while (!p.empty())
{
P q = p.front();
p.pop();
if (q.first.first == n - 1 && q.first.second == m - 1)
{
cout << q.second;
}
for (int i = 0; i < 4; i++)
{
int nx = q.first.first + dt[i][0], ny = q.first.second + dt[i][1];
if (nx >= 0 && nx < n && ny >= 0 && ny < m && mp[nx][ny] != '1' && vis[nx][ny] == 0)
{
vis[nx][ny] = 1;
p.push({{nx, ny}, q.second + d[i]});
}
}
}
return 0;
}