我必须使用递归来解决一个迷宫。迷宫必须在找到开放路径的地方放置一个X(我的代码会这样做)。它必须这样做,直到使用递归调用到达出口为止(我的代码执行此操作,除了下面所述的)。它也必须 在到达死角的地方放置一个O,将Os拉回到“适当”的路径,然后继续沿新路径求解(我的代码执行此操作)。
如何,一旦到达迷宫的尽头,就必须解决一个新的迷宫(原始迷宫,转置后的迷宫)。我的问题如下:
一旦到达迷宫的尽头,我会收到IndexOutOfBoundsException。这是预期的;我无法继续在迷宫界之外进行测试!就是说,如果我尝试以任何方式测试并避免异常,则递归方法调用仍在调用堆栈上,结果是我的方法一直将Os一直写回到起点。 >
我想在退出时简单地中止或退出。我以为我的基本情况可以解决这个问题,但事实并非如此。它一直在继续。从那时起,我无法执行 any 返回,包括通过基本案例进行测试或在方向检查期间进行测试,因为返回会造成一种情况,其中调用堆栈开始解析之前的所有调用点。最终结果是在不应有Os的地方出现Os,并且递归方法在清除调用堆栈之前永远不会“返回”。
将方法更改为bool返回类型不起作用。我已经尝试过了。我得到相同的结果。要么我遇到异常,要么我从最后的死角开始将Os覆盖Xs,一直到出口,一直到起点。
迷宫和我的代码在下面。请帮忙;我已经在这个问题上工作了六个小时,这让我很沮丧。
char[,] maze1 = {
{ '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' },
{ '#', '.', '.', '.', '#', '.', '.', '.', '.', '.', '.', '#' },
{ '#', '.', '#', '.', '#', '.', '#', '#', '#', '#', '.', '#' },
{ '#', '#', '#', '.', '#', '.', '.', '.', '.', '#', '.', '#' },
{ '#', '.', '.', '.', '.', '#', '#', '#', '.', '#', '.', '.' },
{ '#', '#', '#', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
{ '#', '.', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
{ '#', '#', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
{ '#', '.', '.', '.', '.', '.', '.', '.', '.', '#', '.', '#' },
{ '#', '#', '#', '#', '#', '#', '.', '#', '#', '#', '.', '#' },
{ '#', '.', '.', '.', '.', '.', '.', '#', '.', '.', '.', '#' },
{ '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' }
};
递归方法:
private void MazeTraversal(char[,] maze, int row, int col)
{
if (row < maze.GetLength(0) && col < maze.GetLength(1))
{
maze[row, col] = 'X';
Console.Write(writer.WriteMaze(maze));
System.Threading.Thread.Sleep(250);
#region GoNorth
// GoNorth
if (maze[(row - 1), col] == '.')
{
MazeTraversal(maze, row - 1, col);
if (wroteAnO)
{
Console.Write(writer.WriteMaze(maze));
wroteAnO = false;
System.Threading.Thread.Sleep(250);
}
}
#endregion
#region GoSouth
if (maze[(row + 1), col] == '.')
{
MazeTraversal(maze, row + 1, col);
if (wroteAnO)
{
Console.Write(writer.WriteMaze(maze));
wroteAnO = false;
System.Threading.Thread.Sleep(250);
}
}
#endregion
#region GoEast
if (maze[row, (col + 1)] == '.')
{
MazeTraversal(maze, row, col + 1);
if (wroteAnO)
{
Console.Write(writer.WriteMaze(maze));
wroteAnO = false;
System.Threading.Thread.Sleep(250);
}
}
#endregion
#region GoWest
if (maze[row, (col - 1)] == '.')
{
MazeTraversal(maze, row, col - 1);
if (wroteAnO)
{
Console.Write(writer.WriteMaze(maze));
wroteAnO = false;
System.Threading.Thread.Sleep(250);
}
}
#endregion
}
// if nothing contains a ".", we can't go in any direction. Draw an "O"
maze[row, col] = 'O';
wroteAnO = true;
}
答案 0 :(得分:0)
您的问题可能是,永远不会达到等于数组长度的索引(因为最大索引始终为length-1),因此总是执行条件语句。尝试将if (row < maze.GetLength(0) && col < maze.GetLength(1))
更改为if (row < maze.GetLength(0) - 1 && col < maze.GetLength(1) - 1)