如何使用递归退出迷宫?

时间:2016-10-14 23:33:26

标签: c# algorithm data-structures

让我们考虑一个由整数矩阵表示的迷宫:0 - 未访问,1 - 障碍(阻塞位置),2 - 访问,-1 - 输出,(x,y) - 开始位置。我想通过使用递归找到从开始到某个输出的路径。

int[] x_dir = new int[] { 0, 0, -1, 1 }; // x, x, x-1, x + 1
int[] y_dir = new int[] { -1, 1, 0, 0 }; // y-1, y+1, y, y

bool dfs(int[,] maze, int x, int y, int[] x_dir, int[] y_dir)
{
   if (maze[x, y] == -1) { return true; } // output cell marked -1 

   int i = 0;
   while (i < 4 && !dfs(maze, x + x_dir[i], y + y_dir[i], x_dir, y_dir))
   {
      ++i;
   }
   return (i > 4) ? false : true;
}

我有两个问题:我不知道如何处理边缘情况(IndexOutOfRangeException inside maze[x,y])以及如何打印路径。 求你帮帮我。

2 个答案:

答案 0 :(得分:1)

要打印路径,您需要跟踪它,这表示为此目的添加参数。必须注意不要在其中包含错误的转弯,或者至少在您知道它们是什么时将它们移除。

或者,如果您打印出每次调用返回dfs的{​​{1}}所采取的步骤,您将获得路径,但反过来。

至于边缘(非角落)情况:在尝试访问迷宫中的这些位置之前,您需要检查truex+x_dir[i]是迷宫中的有效索引。

答案 1 :(得分:0)

对于打印路径,您可以创建一个额外的矩阵并在其中存储信息。与动态编程解决的最长子序列问题一样。

OR 而不是创建一些额外的矩阵,你可以使用相同的矩阵。要跟踪路径,只需在找到输出单元时保存状态。

while (i < 4)
{ 
    if(!dfs(maze, x + x_dir[i], y + y_dir[i], x_dir, y_dir))
        ++i;
    else
        maze[x][y]=255;
}

然后使用元素255跟随单元格。 希望这会有所帮助。