C语言解决迷宫问题的完整代码带注释
时间: 2023-07-30 15:12:45 浏览: 112
好的,以下是C语言解决迷宫问题的完整代码带注释:
```c
#include <stdio.h>
#include <stdlib.h>
#define ROW 8 // 迷宫的行数
#define COL 8 // 迷宫的列数
int map[ROW][COL] = { // 迷宫地图,0表示可以通行,1表示障碍物不可通行
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 0, 1, 1, 1, 0},
{0, 0, 0, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 1, 0, 1, 0},
{0, 1, 0, 0, 0, 1, 1, 0},
{0, 1, 1, 1, 0, 1, 0, 0},
{0, 1, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0}
};
int visited[ROW][COL] = {0}; // 标记数组,记录每个位置是否已经访问过
typedef struct { // 保存坐标的结构体
int x;
int y;
} Position;
typedef struct { // 保存位置和步数的结构体
Position position;
int step;
} Node;
int is_valid_position(int x, int y) { // 判断坐标是否在迷宫范围内
if (x < 0 || x >= ROW || y < 0 || y >= COL) {
return 0;
}
return 1;
}
int is_valid_move(int x, int y) { // 判断坐标是否可以通行
if (!is_valid_position(x, y) || visited[x][y] || map[x][y]) {
return 0;
}
return 1;
}
void print_path(Node *path, int length) { // 输出路径
printf("The path is:\n");
for (int i = length - 1; i >= 0; i--) { // 逆序输出路径
printf("(%d, %d)\n", path[i].position.x, path[i].position.y);
}
}
void bfs(Position start, Position end) { // 广度优先搜索
Node queue[ROW * COL]; // 队列,保存每个位置和步数
int front = 0, rear = 0; // 队首和队尾
Node node = {{start.x, start.y}, 0}; // 起点入队,步数为0
queue[rear++] = node;
visited[start.x][start.y] = 1; // 标记起点已经访问过
while (front != rear) { // 队列不为空时循环
Node current = queue[front++]; // 取出队首位置
if (current.position.x == end.x && current.position.y == end.y) { // 到达终点,输出路径并结束
print_path(queue, current.step + 1);
return;
}
// 枚举四个方向
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
for (int i = 0; i < 4; i++) {
int new_x = current.position.x + dx[i];
int new_y = current.position.y + dy[i];
if (is_valid_move(new_x, new_y)) { // 可以通行,入队并标记已访问
visited[new_x][new_y] = 1;
Node next = {{new_x, new_y}, current.step + 1};
queue[rear++] = next;
}
}
}
printf("No path found!\n"); // 没有找到路径
}
int main() {
Position start = {1, 1}; // 起点位置
Position end = {6, 6}; // 终点位置
bfs(start, end); // 广度优先搜索
return 0;
}
```
注释已经详细说明了每个函数和数据结构的作用,代码中的广度优先搜索算法用队列实现,从起点开始,枚举四个方向,如果可以通行且没有访问过,就入队并标记已访问,直到找到终点或队列为空。如果找到了终点,就从终点开始逆序输出路径。如果没有找到路径,就输出提示信息。
阅读全文