用c++写一个广度优先搜索
时间: 2024-02-18 15:36:01 浏览: 64
下面是一个简单的 C++ 广度优先搜索的示例代码,来解决迷宫问题:
```c++
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int MAX_SIZE = 100;
// 定义迷宫
int maze[MAX_SIZE][MAX_SIZE];
// 定义访问标记数组
bool visited[MAX_SIZE][MAX_SIZE];
// 定义方向数组
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
// 定义节点结构体
struct Node {
int x;
int y;
int steps;
Node(int _x, int _y, int _steps) : x(_x), y(_y), steps(_steps) {}
};
// 广度优先搜索函数
int bfs(int startX, int startY, int endX, int endY, int n, int m) {
queue<Node> q;
// 将起点加入队列
q.push(Node(startX, startY, 0));
visited[startX][startY] = true;
while (!q.empty()) {
Node cur = q.front();
q.pop();
// 如果到达终点,返回步数
if (cur.x == endX && cur.y == endY) {
return cur.steps;
}
// 遍历四个方向
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 < m && maze[nx][ny] == 0 && !visited[nx][ny]) {
visited[nx][ny] = true;
q.push(Node(nx, ny, cur.steps + 1));
}
}
}
// 如果无法到达终点,返回 -1
return -1;
}
int main() {
int n, m;
cin >> n >> m;
int startX, startY, endX, endY;
cin >> startX >> startY >> endX >> endY;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> maze[i][j];
}
}
int steps = bfs(startX, startY, endX, endY, n, m);
cout << steps << endl;
return 0;
}
```
这个代码可以输入一个 `n` 行 `m` 列的迷宫(`0` 表示可以通过,`1` 表示障碍物),起点和终点的坐标,然后输出从起点到终点的最短路径长度。
阅读全文