#include <stdio.h>
#define MAX_ROW 5
#define MAX_COL 5
struct point {
int row, col, predecessor;
}
queue[512];
int head = 0, tail = 0;
void enqueue(struct point p){ // 迷宫位置入队列
queue[tail] = p;
tail++;
}
struct point dequeue(void){ // 迷宫位置出队列
head++;
return queue[head-1];
}
int is_empty(void){ // 位置队列是否为空
return head == tail;
}
int maze[MAX_ROW][MAX_COL] = { // 迷宫
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
void print_maze(void){ // 打印迷宫
int i, j;
for (i = 0; i < MAX_ROW; i++) {
for (j = 0; j < MAX_COL; j++)
printf("%d ", maze[i][j]);
putchar('\n');
}
printf("*********\n");
}
void visit(int row, int col){ //
struct point visit_point = { row, col, head-1}; //记录刚刚队头出一个位置,为前驱
maze[row][col] = 2; // 在迷宫地图上标记该位置已经走过
enqueue(visit_point); // 位置入队尾,最后探索
}
int main(void){
struct point p = { 0, 0, -1 };
maze[p.row][p.col] = 2;
enqueue(p);
while (!is_empty()) {
p = dequeue(); // 从队头出一个位置
if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1)
break; // 到达目标位置
if (p.col+1 < MAX_COL && maze[p.row][p.col+1] == 0)
visit(p.row, p.col+1); //探索出来位置的下面
if (p.row+1 < MAX_ROW && maze[p.row+1][p.col] == 0)
visit(p.row+1, p.col); //探索出来位置的右面
if (p.col-1 >= 0 && maze[p.row][p.col-1] == 0)
visit(p.row, p.col-1); //探索出来位置的上面
if (p.row-1 >= 0 && maze[p.row-1][p.col] == 0)
visit(p.row-1, p.col); //探索出来位置的左面
print_maze();
}
if (p.row == MAX_ROW - 1 && p.col == MAX_COL -1) {
printf("(%d, %d)\n", p.row, p.col);
while (p.predecessor != -1) {
p = queue[p.predecessor];
printf("(%d, %d)\n", p.row,p.col);
}
}
else
printf("No path!\n");
return 0;
}
走迷宫--广度优先搜索--队列
最新推荐文章于 2024-07-21 18:30:44 发布
本文介绍了使用广度优先搜索(BFS)算法解决迷宫问题,通过队列作为辅助数据结构,从起点开始层层展开搜索,确保找到最短路径。详细阐述了算法的实现步骤,并探讨了其在寻找最短路径问题中的优势。
摘要由CSDN通过智能技术生成