目录
牛客_走迷宫(简单bfs)
解析代码:
牛客_走迷宫(简单bfs)
走迷宫__牛客网
解析代码:
- 采用一个二维数组,不断的接受迷宫地图(因为有多个地图),获取到迷宫地图后,采用广度优先方式走迷宫,找到的第一条路径一定是最短的路径,但是深度优先则不一定。
- 结构设定: pos:x,y表示当前所在位置。level所经过步数。dir: 表示当前位置的上、下、左、右四个方向。queue: 广度优先遍历,需要用到队列,保存所经路径。visit:对走过的路径进行标记。start和end表示入口和出口
- 采用广度优先方式走迷宫:将start入队列,对该位置进行标记,只要队列不为空,继续以下步骤,直到到达出口:从队列中取出当前位置cur,计算该位置的上、下、坐、右四个方向,计算要走的下一步如果next在出口的位置,已经找到返回所走步数level 否则:如果该位置有效(坐标在地图中)不是墙(该位置字符为'.'),并且没有走过(visit标记为false)时,将该位置入队列,再继续其他几个方向
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
int nearestExit(vector<string>& maze)
{
int m = maze.size(), n = maze[0].size(), ret = 0;
vector<vector<bool>> vis(m, vector<bool>(n, false));
queue<vector<int>> q; // 存下标的队列
q.push({0, 1}); // 入口入队
vis[0][1] = true;
while(!q.empty())
{
++ret; // 一层加一次步数
int size = q.size();
for(int i = 0; i < size; ++i) // 访问当前层
{
vector<int> tmp = q.front();
q.pop();
for(int j = 0; j < 4; ++j)
{
int x = tmp[0] + dx[j], y = tmp[1] + dy[j];
if(x >= 0 && x < m && y >= 0 && y < n
&& maze[x][y] == '.' && !vis[x][y])
{
if(x == 9 && y == 8)
return ret; // 是出口就返回
q.push({x, y});
vis[x][y] = true;
}
}
}
}
return -1;
}
int main()
{
vector<string> map(10); // 地图
int i = 0;
while (cin >> map[i++])
{
if (10 == i)
{
// 已经将地图中的数据接收完成
cout << nearestExit(map) << endl;
i = 0;
}
}
return 0;
}