C# 停止递归
所以我制作了一个迷宫,“#”是墙,“.”是可以移动的坐标。我试图在递归走出迷宫时停止它。所以当其中一个(x,y)为12时。这可能是一个简单的解决方案 这是我的迷宫C# 停止递归,c#,recursion,C#,Recursion,所以我制作了一个迷宫,“#”是墙,“.”是可以移动的坐标。我试图在递归走出迷宫时停止它。所以当其中一个(x,y)为12时。这可能是一个简单的解决方案 这是我的迷宫 char[,] maze1 = // USE THIS { { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' }, { '#', '.', '.', '.', '#', '.', '.', '.', '.',
char[,] maze1 =
// USE THIS
{ { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' },
{ '#', '.', '.', '.', '#', '.', '.', '.', '.', '.', '.', '#' },
{ '#', '.', '#', '.', '#', '.', '#', '#', '#', '#', '.', '#' },
{ '#', '#', '#', '.', '#', '.', '.', '.', '.', '#', '.', '#' },
{ '#', '.', '.', '.', '.', '#', '#', '#', '.', '#', '.', '.' },
{ '#', '#', '#', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
{ '#', '.', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
{ '#', '#', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
{ '#', '.', '.', '.', '.', '.', '.', '.', '.', '#', '.', '#' },
{ '#', '#', '#', '#', '#', '#', '.', '#', '#', '#', '.', '#' },
{ '#', '.', '.', '.', '.', '.', '.', '#', '.', '.', '.', '#' },
{ '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' } };
这是我的方法
private void mazeTraversal(int currentX, int currentY, char[,] maze)
{
/*************** ATTEMPT 1 ******************/
// Checks if coordinates are inside the maze
if (currentX <= 11 && currentY <= 11)
{
// Implement maze traversal recursive call
//PrintOriginalMaze(maze, currentX, currentY);
// If the coordinate is a '.' , continue(This is the base case)
if ('.' == maze[currentX, currentY])
{
// Changes location to a X so you cant go back.
maze[currentX, currentY] = 'X';
// Implement maze traversal recursive call
PrintOriginalMaze(maze, currentX, currentY);
mazeTraversal(currentX, currentY + 1, maze);
// maze[currentX, currentY] = 'X';
mazeTraversal(currentX - 1, currentY, maze);
//maze[currentX, currentY] = 'X';
mazeTraversal(currentX + 1, currentY, maze);
// maze[currentX, currentY] = 'X';
mazeTraversal(currentX, currentY - 1, maze);
//maze[currentX, currentY] = 'X';
}
if ('#' == maze[currentX, currentY])
{
Console.WriteLine("Hit a wall");
Console.WriteLine();
}
}
}
private void mazeTraversal(int currentX,int currentY,char[,]maze)
{
/***************尝试1******************/
//检查坐标是否在迷宫内
如果(currentX你真的应该在迷宫中放置一个“出口”节点。我想在[4][11]处。那么,如果你找到了出口(节点),那将是一个简单的检查
这里有一个关于游戏板的古老问题:“我如何处理游戏场外的东西?”以及“如果我在边界,想检查所有相邻的细胞,我该怎么办?”
在很大程度上,你避免了这个问题。你有一个“边界”墙的边界。在游戏板周围放置一个不可输入的边界是解决方案之一。另一个解决方案将处理所有索引检查。但就我个人而言,我更喜欢计算边界。如果我理解你的问题,并且你试图确定当前的x
和y
是否超出你的迷宫边界(数组
)
你可以用
获取中指定维度的最后一个元素的索引
数组
var maxX=maze1.GetUpperBound(0);
var maxY=maze1.GetUpperBound(1);
如果(currentX>maxX | | currentX<0 | | currentY>maxY | | currentY<0)
返回;
停止递归只是一致地退出方法(在某些状态下)若要打开调用,即在当前xy
超出边界时使用返回
。如果x或y也为0,您是否会在迷宫之外?您应该显示更多代码以实际显示递归。此时,我猜代码属于PrintOriginalMaze
e> mazeTraversal
do?顺便说一句,方法应该以大写开头。为什么要使用递归而不仅仅是循环?为什么我们在这里使用递归?我的意思是,这听起来像是stackoverflow'vile的单行道。另外,为什么不检查数组的边界呢?显然,如果你超出了边界,你就是goneskis
var maxX = maze1.GetUpperBound(0);
var maxY = maze1.GetUpperBound(1);
if (currentX > maxX || currentX < 0 || currentY > maxY || currentY < 0)
return;