c

时间:2018-11-08 01:22:11

标签: c

这是一个迷宫解决程序。它应该与包含迷宫的txt文件一起运行,格式为:

5 5
%%%%%
S % %
% % %
%   E
%%%%%

前两个数字应该是迷宫的宽度和高度,“%”应该是墙壁,“ 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行是intsolveMazeDFS(maze_t * maze,int col,int row)之后的左花括号。我对此并不陌生,说实话在这一点上很失落。

1 个答案:

答案 0 :(得分:0)

  if(maze->cells[row][col] == ' '){
    maze->cells[row][col] = '*';
  }

这里需要一个else return 0;。否则,您可以无限地来回移动。如果正方形已经被占用,我们将无法再次获取。