这个迷宫问题的解答,主要参考了《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},{-1,-1},{-1,-1},{-1,-1}},
};
void visit (int row, int col, struct point pre)
{
struct point visit_point = {row, col};
maze[row][col] = 2;
predece