【发布时间】:2020-11-01 02:59:35
【问题描述】:
我正在尝试用 C 语言编写一个程序来跟踪迷宫求解器的递归回溯算法的整个搜索过程。因此,我将打印出所采取的每一步。迷宫是一个简单的迷宫,'#' 代表墙壁,'.'表示空单元格,“@”表示初始起点。给定一个起点,我们必须到达迷宫的任何边缘才能完成它。我的搜索算法首先尝试搜索一条向北、然后向东、然后向南然后向西的路径。 (我以此作为参考:http://www.cs.bu.edu/teaching/alg/maze/)
给定迷宫的输入示例:
#######
###.###
###.###
...@..#
###.###
###.###
#######
我的代码试图做什么/输出:
//step 1
#######
###.###
###.###
...+..#
###.###
###.###
#######
//step 2
#######
###.###
###+###
...+..#
###.###
###.###
#######
//Step 3
#######
###+###
###+###
...+..#
###.###
###.###
#######
//Step 4
#######
###X###
###+###
...+..#
###.###
###.###
#######
//step 5
#######
###X###
###X###
...+..#
###.###
###.###
#######
//Step 6
#######
###X###
###X###
...++.#
###.###
###.###
#######
.
. subsequent steps leading to final output
.
.
#######
###X###
###X###
++++XX#
###X###
###X###
#######
以下是我的代码中尝试执行此操作的相关函数示例:
bool is_goal(long row, long col, long m, long n)
{
if (row == 0 || col == 0 || row == m - 1 || col == n - 1) {
return true;
}
return false;
}
bool is_wall(char **maze, long row, long col)
{
if (maze[row][col] == WALL) {
return true;
}
return false;
}
bool find_path(char **maze, char **maze_cpy, long row, long col, long m, long n, long step)
{
print_maze(maze_cpy, m, step);
step += 1;
//Base cases
if (is_goal(row, col, m, n)) {
return true;
}
if (is_wall(maze, row, col)) {
return false;
}
//used to indicate current cell is part of soln
maze_cpy[row][col] = '+';
//Recursive cases
//Go up
if (find_path(maze, maze_cpy, row - 1, col, m, n, step)) {
return true;
}
//Go right
if (find_path(maze, maze_cpy, row, col + 1, m, n, step)) {
return true;
}
//Go down
if (find_path(maze, maze_cpy, row + 1, col, m, n, step)) {
return true;
}
//Go left
if (find_path(maze, maze_cpy, row, col - 1, m, n, step)) {
return true;
}
//At this point, no solution
maze_cpy[row][col] = 'X';
return false;
}
但是,我的输出递归函数只在第 3 步停止,我无法弄清楚为什么它不回溯并更新它作为不可用路径(带有“X”)所采用的路径。帮助将不胜感激。 (对不起,这个问题很长,我尽量把它格式化)。
【问题讨论】:
-
您是否尝试过在调试器中单步执行代码?这告诉你什么?
-
@Someprogrammerdude 是的。该功能在第一次撞墙后停止。我想知道当返回 false 时是否必须显式使 find_path 函数返回到上一个递归级别。
标签: c multidimensional-array recursive-backtracking