让我们考虑一个由整数矩阵表示的迷宫: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]
)以及如何打印路径。
求你帮帮我。
答案 0 :(得分:1)
要打印路径,您需要跟踪它,这表示为此目的添加参数。必须注意不要在其中包含错误的转弯,或者至少在您知道它们是什么时将它们移除。
或者,如果您打印出每次调用返回dfs
的{{1}}所采取的步骤,您将获得路径,但反过来。
至于边缘(非角落)情况:在尝试访问迷宫中的这些位置之前,您需要检查true
和x+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跟随单元格。 希望这会有所帮助。