此例序12.3 选自Linux C宋劲杉的书,原文是用来表现堆栈和深度优先搜索的应用。
针对原code我改了下迷宫之后发现,称为深度优先貌似也不对。原迷宫不帖了。以下是改了一个点之后的迷宫和完整code。难点理解已经在code边上做了笔记。疑问描述见运行截图之后。
#include <stdio.h>
#define MAX_ROW 5
#define MAX_COL 5
struct point {int row, col;} stack[512];
int top = 0;
void push (struct point p){
stack[top++] = p;
}
struct point pop (void){
return stack[--top];
}
int is_empty(void){
return top == 0;
}
int maze[MAX_ROW][MAX_COL] = {
{0,1,0,1,0},
{0,1,0,0,0},
{0,0,0,1,0},
{0,1,0,1,0},
{0,1,0,0,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");
}
struct point predecessor[MAX_ROW][MAX_COL] = {
{{-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;
predecessor[row][col] = pre;
push (visit_point);
}
int main (void){
struct point p = {0,0};
maze[p.row][p.col] = 2;
push (p);
while (!is_empty()){
p = pop();
if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1) //goal
break;
if (p.col+1 < MAX_COL && maze[p.row][p.col+1] == 0) //right
visit(p.row, p.col+1, p);
if (p.row+1 < MAX_ROW && maze[p.row+1][p.col] == 0) //down
visit(p.row+1, p.col, p);
if (p.col - 1 >= 0 && maze[p.row][p.col-1] == 0) //left
visit(p.row, p.col-1, p);
if (p.row - 1 >= 0 && maze[p.row-1][p.col] == 0) //up
visit(p.row-1, p.col, p);
print_maze();
}
if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1) {
printf("(%d, %d)\n", p.row, p.col);
while (predecessor[p.row][p.col].row != -1) { /*这里的坐标会往前趋的问题一开始一直没懂,其实想法在于predecessor们其实都在上面那些IF语句里面被存了,原来的-1,-1坐标都因为些row+1,col+1而渐渐改变。而到了最后的第一个起始坐标数组[0,0]那里,它的predecessor还是没变还是-1,-1.*/
p = predecessor[p.row][p.col];
printf("(%d, %d)\n", p.row, p.col);
}
} else
printf("No path!\n");
return 0;
}
下面是运行结果以及质疑它是深度搜索应用的质疑。
疑问:最后竟是这个样子...能算深度搜索的code么?
**目前能想到的是up等级最高所以up上去之后程序在此基础上会遍历完。其次是left,然后down,最后是right。
补充:看到了例12.4广度优先,原来真是我没明白他的深意...