我正在创建一个递归导航迷宫的程序。代码:
public static boolean traverse(int maze[][], coordinate start)
{
//recursion: traverse(maze, updated coordinates)
if(maze[start.y+1][start.x] == 2 || maze[start.y-1][start.x] == 2 || maze[start.y][start.x+1] == 2 || maze[start.y][start.x - 1] == 2)
{
display(maze);
System.out.println("DONE");
return true;
}
else
{
if(north(maze, start) == true)
{
maze[start.y-1][start.x] = 4;
display(maze);
coordinate temp = start;
temp.y--;
if (traverse(maze, temp) == false)
{
maze[start.y][start.x] = 3;
}
}
if(west(maze, start) == true)
{
maze[start.y][start.x-1] = 4;
display(maze);
coordinate temp = start;
temp.x--;
if (traverse(maze, temp) == false)
{
maze[start.y][start.x] = 3;
}
}
if(south(maze, start) == true)
{
maze[start.y+1][start.x] = 4;
display(maze);
coordinate temp = start;
temp.y++;
if (traverse(maze, temp) == false)
{
maze[start.y][start.x] = 3;
}
}
if(east(maze, start) == true)
{
maze[start.y][start.x+1] = 4;
display(maze);
coordinate temp = start;
temp.x++;
if (traverse(maze, temp) == false)
{
maze[start.y][start.x] = 3;
}
}
}
return false;
}
然而,每当我到达死胡同时,它都不会回溯。当我调试时,它表明当程序从递归或“回溯”返回时,我的起始值专注于停留在我的死胡同空间。
例如:
1 1 1 1 1
1 4 4 4 1
1 9 1 4 1
1 1 1 4 1
1 4 4 4 1
1 4 1 0 1
1 4 1 0 1
1 1 1 2 1
9是我的出发点。2是我的退出。4是我的道路。1 表示墙壁。当我到达一个死胡同时(在本例中为第 7 行,第 2 列)。我的立场是等于整个程序其余部分的死胡同空间。这是为什么呢?
你可以缩短很多。试试他的代码。
public static boolean traverse(int[][] maze, int x, int y) {
if(y >= maze.length || x >= maze[y].length) return false;
int value = maze[y][x];
if(value == 2) {
display(maze);
System.out.println("DONE");
return true;
} else if(value == 0 || value == 9) {
maze[y][x] = 4;
boolean success = false;
loop:
for(int dy = -1; dy <= 1; dy++) {
for(int dx = -1; dx <= 1; dx++) {
if(dx == 0 && dy == 0 ||
dx != 0 && dy != 0) continue;
success |= traverse(maze, x + dx, y + dy);
if(success) break loop;
}
}
maze[y][x] = value;
return success;
}
return false;
}
public static void main(String[] args) {
int[][] maze = {{1, 1, 1, 1, 1},
{1, 0, 0, 0, 1},
{1, 9, 1, 0, 1},
{1, 1, 1, 0, 1},
{1, 0, 0, 0, 1},
{1, 0, 1, 0, 1},
{1, 0, 1, 0, 1},
{1, 1, 1, 2, 1}};
int x = 0, y = 0;
loop:
for(y = 0; y < maze.length; y++) {
for(x = 0; x < maze[y].length; x++) {
if(maze[y][x] == 9) break loop;
}
}
boolean success = traverse(maze, x, y);
System.out.println();
System.out.println(success);
display(maze);
}
当您向上移动堆栈时,值会更新并且永远不会“回溯”,因为它们不会在每个级别中保留其原始值,回溯基本上是在树中行走,如果每个节点在每个级别更新时不保留原始值,则每个节点都将具有叶节点的值,当叶子节点得到满足时, 节点不记得它们的原始值。相反,您需要在向上遍历堆栈时传递一个新值,而无需更新每个堆栈,以记住它们被其父级调用时所拥有的内容。
最简单的方法是尝试,
traverse(int maze[][], int x , int y)
您的后续呼叫将如下所示
if(north(maze, x , y) == true)
{
maze[y-1][x] = 4;
display(maze);
//temp.y--;
if (traverse(maze, x , y-1) == false)
{
maze[y][x] = 3;
}
}
或者你可以在返回当前堆栈后重置你的值,
我还没有检查你的代码的其余部分,但这可能是代码不回溯的原因
我正在开发高级培养皿网络编辑器/模拟器。首先,这里有一些词汇 圆圈=位置 矩形=过渡 就地整数 = 标记 过渡状态=防护 我被困在通过过渡的守卫。守卫是一个条件,如果你想执行转换,这需要是真的。我知道我应该以某种方式使用回溯,但我不知道在程序开始之前进入过渡的位置数,所以我不能使用循环,因为我不知道我需要多少个循环。 所以,我想从第一位获取第一个令牌,从第二位获取第一令牌,然后尝试通过守卫,如果通
我的问题是,当一个9不能正确添加时,该方法会中断。不知何故,我不知道如何让它回到前一点,并向上数,这将创建一个新的“路径”,所以我想如果我做对了,一切都应该很好。我仍然在使用递归:-/ 正如我所知,我认为Sudokurecrect()做了它应该做的事情。编辑:您可以忽略布尔测试。我知道我不使用它,我试着想一些东西,但显然我不知道如何使用它。 输出为 在那之后,不管检查哪个变体。所以问题是一样的。
我对编码还是很陌生的,我正在尝试一些稍微困难的主题,例如修改数独递归回溯程序的解决方案。最初的解决方案是针对大小为3x3的数独,我希望我的解决方案可以与正常大小的数独(9x9)一起使用。3x3解决方案在这里找到。 我觉得我对算法非常了解:对于网格中的每个列表(包含该单元格的可能值),在每一步尝试每个数字,确保电路板仍然有效,移动到下一个列表,分配一个可能的数字直到其有效,等等。如果当前电路板不正确
我试图用C++中的回溯和递归来解决C++中的幻方问题。特别适用于4x4数组。 4x4幻方解的一个例子如下,其中每行、每列和对角线加34: 我所做的更改是:用户输入一些值,这些值将启动算法。 我的算法是这样的: 在这里你可以更好地欣赏图像。 我有一个概念,算法应该如何工作,以解决幻方的问题,回溯和递归,但我有问题。 其中之一是: 成就并没有让我的算法“忽略”用户已经输入的值。 我在C++中的代码在G
我的任务是用回溯和递归的方法解决一个迷宫。这更多的是一个关于这个概念的概念问题。 回溯电话是如何接通的?从我所看到的所有示例来看,似乎递归总是在回溯步骤之前立即调用,所以回溯是无法实现的。谁能给我解释一下回溯步骤是怎么达到的?
回溯和递归有什么区别?这个程序是如何运作的?