这个迷宫问题的解答,主要参考了《LINUX一站式编程》中的第12章“栈与队列”的正文和习题。
假设有这样一个迷宫,用一个5*5的数组来表示,其中0表示有路可走,1表示无路可走。那么,如何找到一个通路,使得可以从左上角的(0,0)点走到右下角的(4,4)点?
| 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 |
分成三个办法来解决这个问题。堆栈,递归和队列。
第一种,使用堆栈进行深度优先搜索。堆栈的先进后出实现了深度优先搜索。其中,如果一个点被探测过了,就标记为2,避免以后重复探索。为了记载历史路径信息,使用了predecessor数组。代码和解如下:
//堆栈版迷宫问题
struct point{int row, col;} stack[512];
int top = 0;
int LEN=5;
int maze[5][5] = {
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 push(struct point p)
{
stack[top++] = p;
return;
}
struct point pop()
{
return stack[--top];
}
int is_empty()
{
return top == 0;
}
void print_maze()
{
int i,j;
for(i=0;i<LEN;i++)
{
for(j=0;j<LEN;j++)
printf("%d",maze[i][j]);
putchar('\n');
}
printf("**********\n");
}
struct point predecessor[5][5] = {
{
{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
{
{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
{
{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
{
{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
{
{-1,-1},{-1,-1

本文介绍了如何使用堆栈、递归和队列解决迷宫问题,从左上角(0,0)到右下角(4,4)的通路寻找。堆栈实现深度优先搜索,递归利用系统堆栈进行搜索,队列则用于广度优先搜索,其中队列能确保找到最短路径且空间利用率相对较低。"
44596287,4960311,最大化美观度的种树策略,"['算法', '数据结构', '编程竞赛', '优化策略']
最低0.47元/天 解锁文章
2万+





