用c++ 写一下 lee算法
时间: 2023-08-16 09:06:59 浏览: 45
以下是 C++ 实现的 Lee 算法:
```cpp
#include <iostream>
#include <cstring>
#include <queue>
#define MAXN 100 // 最大节点数
using namespace std;
int n, m; // 图的行数和列数
char maze[MAXN][MAXN]; // 迷宫
int sx, sy; // 起点坐标
int ex, ey; // 终点坐标
int dis[MAXN][MAXN]; // 距离数组
bool vis[MAXN][MAXN]; // 访问标记数组
const int dx[4] = {1, -1, 0, 0}; // 四个方向
const int dy[4] = {0, 0, 1, -1};
struct Node { // 节点类
int x, y;
Node(int x = 0, int y = 0): x(x), y(y) {}
};
bool is_valid(int x, int y) { // 判断节点是否合法
if (x < 0 || x >= n || y < 0 || y >= m) return false;
if (maze[x][y] == '#') return false;
if (vis[x][y]) return false;
return true;
}
void bfs(int x, int y) { // bfs搜索函数
memset(vis, false, sizeof(vis));
memset(dis, -1, sizeof(dis));
queue<Node> q;
vis[x][y] = true;
dis[x][y] = 0;
q.push(Node(x, y));
while (!q.empty()) {
Node cur = q.front();
q.pop();
for (int i = 0; i < 4; i++) {
int nx = cur.x + dx[i];
int ny = cur.y + dy[i];
if (is_valid(nx, ny)) {
vis[nx][ny] = true;
dis[nx][ny] = dis[cur.x][cur.y] + 1;
q.push(Node(nx, ny));
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> maze[i];
for (int j = 0; j < m; j++) {
if (maze[i][j] == 'S') {
sx = i;
sy = j;
} else if (maze[i][j] == 'E') {
ex = i;
ey = j;
}
}
}
bfs(sx, sy);
cout << dis[ex][ey] << endl;
return 0;
}
```
其中,`maze` 数组表示迷宫地图,`vis` 数组表示节点是否访问过,`dis` 数组表示起点到每个节点的距离。`bfs` 函数进行 BFS 搜索,`is_valid` 函数判断节点是否合法。最后输出终点到起点的距离即可。