深度优先搜索解决迷宫问题
Posted C语言进阶学习
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度优先搜索解决迷宫问题相关的知识,希望对你有一定的参考价值。
学习难,
难在于当你处于学习过程时对自己的克制,
编程亦是如此。
算法简介
/*
* 前序遍历
*/
static void pre_order_tree(tree_p node) {
if ( node == NULL ) {
return;
}
printf("%d ", node->value);
pre_order_tree(node->left);
pre_order_tree(node->right);
}
迷宫问题
有一二维数组定义如下:
int maze[MAX_ROW][MAX_COL] = {
0, 1, 0, 0, 0,
0, 0, 0, 1, 0,
0, 1, 1, 0, 1,
0, 1, 0, 0, 0,
0, 0, 0, 1, 0,
};
解决思路
/**
* @brief 深度优先搜索算法获得迷宫路径
* @param entrance 入口坐标
* @param exit 出口坐标
* @param maze 迷宫(二维数组,1表示墙,0表示路)
*/
void get_maze_path(maze_t const entrance, maze_t const exit, int maze[MAX_ROW][MAX_COL]) {
maze_t m;
maze_t path[MAX_ROW][MAX_COL];
init_maze_path(path);
set_explored(entrance, maze);
push(entrance);
while (!is_empty()) {
m = pop();
/**
* 出口
*/
if (m.x == exit.x && m.y == exit.y) {
break;
}
/**
* 分别依次搜索当前点的上、下、左、右四个方向
*/
if (m.y-1 >= 0 && maze[m.x][m.y - 1] == 0) {
explore((maze_t) { m.x, m.y - 1 }, m, maze, path);
}
if (m.y + 1 <= COL_BORDER && maze[m.x][m.y + 1] == 0) {
explore((maze_t) { m.x, m.y + 1 }, m, maze, path);
}
if (m.x - 1 >= 0 && maze[m.x - 1][m.y] == 0) {
explore((maze_t) { m.x - 1, m.y }, m, maze, path);
}
if (m.x + 1 <= ROW_BORDER && maze[m.x + 1][m.y] == 0) {
explore((maze_t) { m.x + 1, m.y }, m, maze, path);
}
print_maze_debug(maze);
}
if (m.x == exit.x && m.y == exit.y) {
/**
* 由于保存的路径是从出口到入口,因此将其入栈后再打印。
*/
clear_stack();
do {
push(m);
m = path[m.x][m.y];
} while (path[m.x][m.y].x != -1);
push(m);
while (!is_empty()) {
m = pop();
printf("( %d, %d )\n", m.x, m.y);
}
}
else {
printf("No path\n");
}
}
从代码中可以看出,我们使用了“栈”来辅助该算法,因为这次没有采用递归,所以随便手写一个栈来保存当前访问到的点。在这里我们设置的方向顺序是上、下、左、右,并且当找到出口后就结束了,并没有继续找第二条可走的路径,有兴趣的读者可以尝试以下找出所有路径。运行截图如下:
图中,2表示已经走过的点,在第10次搜索时结束。我们可以看到右上部分的一些点并没有搜索就结束了,这是因为优先搜索的方向设置问题,右方向是最后才搜索的,而且程序一旦找到出口就结束,所以有一些地方并没有搜索。如果我们优先搜索右边的点,情况就不一样了,如下图:
花里胡哨的版本
/**
* 调试宏定义
*/
/**
* 使用界面
*/
//#undef _USE_UI_
如果想要UI,则定义宏“_USE_UI_”,如不需要UI,取消定义“_USE_UI_”宏即可,同时还提供了Debug模式,开启Debug模式,可以查看每一次搜索后地图的情况,但Debug模式只能在无UI下使用。演示视频中读者可能会觉得刷新频率太快,当然这个也可以在“config.h”中修改,单位是毫秒,如下:
/**
* 使用UI时,刷新UI时间
*/
总结
链接:https://pan.baidu.com/s/1R4R_nsZ8CZj6E9i2h9iC2Q
提取码:aoqk
如果你有想学或者正在学习C语言的好友,长按二维码图即可分享。
也可以长按二维码图添加作者微信交流。
以上是关于深度优先搜索解决迷宫问题的主要内容,如果未能解决你的问题,请参考以下文章