【发布时间】:2018-11-08 01:22:11
【问题描述】:
这是一个迷宫解决程序。它应该与包含迷宫的 txt 文件一起运行,格式如下:
5 5
%%%%%
S % %
% % %
% E
%%%%%
前2个数字应该是迷宫的宽度和高度,'%'应该是墙,'S'是开始,'E'是结束,标记'*'代表解决方案,并标记 '~' 表示尝试但失败的路径。
这是我的solveMazeDFS代码:
int solveMazeDFS(maze_t * maze, int col, int row)
{ //This is line 102
if(col < 0 || row < 0 || col >= maze->width || row >= maze->height){
return 0;
}
if(maze->cells[row][col] == '%' || maze->cells[row][col] == '~'){
return 0;
}
if(maze->cells[row][col] == 'E'){
return 1;
}
if(maze->cells[row][col] == ' '){
maze->cells[row][col] = '*';
}
if(solveMazeDFS(maze, col - 1, row) == 1){
return 1;
}
if(solveMazeDFS(maze, col + 1, row) == 1){
return 1;
}
if(solveMazeDFS(maze, col, row - 1) == 1){
return 1;
}
if(solveMazeDFS(maze, col, row + 1) == 1){
return 1;
}
maze->cells[row][col] = '~';
return 0;
}
我不断收到分段错误。我用 valgrind 运行代码,看看到底哪里出了问题,它告诉我线程 #1 中的堆栈溢出:无法在 0x400AED 将堆栈增长到 0x1ffe801000:solveMazeDFS (maze.c:102) 所以基本上第 102 行是 int solveMazeDFS(maze_t * maze, int col, int row) 之后的左大括号。我是新手,老实说,在这一点上很迷茫。
【问题讨论】:
-
你可能有无限递归。
-
在调试器下运行程序,你应该可以看到它是如何递归的以及为什么递归没有结束。
-
想想你没有在早期检查的情况。
-
一开始还需要检查
*,避免来回走动 -
以这种方式使用递归不是一个好主意。改用迭代。
标签: c