解释一下用c++实现广度优先搜索实现迷宫的每行代码
时间: 2024-03-20 20:43:53 浏览: 72
以下是使用 C++ 实现广度优先搜索(BFS)算法解决迷宫问题的代码,我会逐行进行解释:
```c++
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
// 迷宫的大小
const int N = 5;
// 定义迷宫
int maze[N][N] = {
{0, 0, 0, 0, 0},
{0, 1, 0, 1, 0},
{0, 0, 0, 0, 0},
{0, 1, 0, 1, 0},
{0, 0, 0, 0, 0}
};
// 定义节点结构体
struct Point {
int x; // 行坐标
int y; // 列坐标
int step; // 当前节点的步数(即从起点到该点的最少步数)
};
// 定义 BFS 函数
int bfs(int startx, int starty, int endx, int endy) {
queue<Point> q;
Point start = {startx, starty, 0};
q.push(start); // 将起点加入队列
// 定义方向数组,用于遍历上下左右四个方向
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
// 定义 visited 数组,用于记录是否已经访问过某个节点
vector<vector<int>> visited(N, vector<int>(N, 0));
visited[startx][starty] = 1;
// 开始 BFS
while (!q.empty()) {
Point cur = q.front();
q.pop();
// 如果当前节点是终点,则返回最少步数
if (cur.x == endx && cur.y == endy) {
return cur.step;
}
// 遍历上下左右四个方向
for (int i = 0; i < 4; i++) {
int nx = cur.x + dx[i];
int ny = cur.y + dy[i];
// 判断下一个节点是否在迷宫内,并且是否可达(即不是障碍物),以及是否已经访问过
if (nx >= 0 && nx < N && ny >= 0 && ny < N && maze[nx][ny] == 0 && visited[nx][ny] == 0) {
Point next = {nx, ny, cur.step + 1};
q.push(next); // 将下一个节点加入队列
visited[nx][ny] = 1; // 标记已经访问过
}
}
}
// 如果无法到达终点,则返回 -1
return -1;
}
int main() {
int startx = 0, starty = 0;
int endx = 4, endy = 4;
int ans = bfs(startx, starty, endx, endy);
cout << "从起点到终点的最短距离为:" << ans << endl;
return 0;
}
```
首先,我们包含了三个头文件:`iostream`,`queue`,`vector`,分别用于输入输出、队列和动态数组的操作。
然后,我们定义了迷宫的大小 `N` 和迷宫数组 `maze`,其中 `0` 表示空地,`1` 表示障碍物。
接着,我们定义了一个节点结构体 `Point`,包含三个成员变量:`x` 表示行坐标,`y` 表示列坐标,`step` 表示当前节点的步数。
然后,我们定义了 BFS 函数 `bfs`,该函数接受起点和终点的坐标作为参数。在函数内部,我们首先创建了一个队列 `q`,并将起点加入队列。然后,我们定义了方向数组 `dx` 和 `dy`,用于遍历上下左右四个方向。接着,我们创建了一个二维动态数组 `visited`,用于记录是否已经访问过某个节点。然后,我们开始 BFS 循环,当队列不为空时,取出队列的头节点 `cur`,判断该节点是否是终点,如果是,则返回当前步数;否则,遍历上下左右四个方向,判断下一个节点是否在迷宫内,并且是否可达(即不是障碍物),以及是否已经访问过。如果下一个节点满足条件,则将其加入队列,并标记为已访问。最后,如果无法到达终点,则返回 -1。
最后,我们在 `main` 函数中定义了起点和终点的坐标,并调用 `bfs` 函数求解最短距离。
阅读全文