我是Java的新手,我正试图通过递归来解决迷宫问题。我在下面添加了部分代码。我有一个包含“字段”的2D数组。墙是1,给出起始坐标和结束坐标。
我有一个问题;
我想在无法继续的情况下擦除路径的位置&结束还没有到达。我该怎么做?
但是我无法弄明白,也许我做错了。
PS:我在论坛上搜索了很多关于递归的内容以及其他人如何处理他们的问题,但我无法弄清楚如何修复这些代码。-P代表Path - 宽度和宽度高度来自2D阵列, - 我从开始导航开始(xstart,ystart)(这就是为什么我需要在找到B(开始)时尝试新的位置
navigate(int x, int y) {
if (x < 0 || x > width - 1 || y < 0 || y > height - 1) {
return;
}
if (maze[x][y] == '1') {
return;
}
if (maze[x][y] == 'E') {
maze[x][y] = 'P';
}
if (maze[x][y] == 'P') {
return;
}
if (maze[x][y] == '0') {
maze[x][y] = 'P';
return;
}
if (maze[x][y] == 'B') {
maze[x][y] = 'P';
navigate(x + 1, y);
navigate(x, y + 1);
navigate(x - 1, y);
navigate(x, y - 1);
return;
}
maze[x][y] = 'P';
navigate(x + 1, y);
navigate(x, y + 1);
navigate(x - 1, y);
navigate(x, y - 1);
}
if (x < 0 || x > width - 1 || y < 0 || y > height - 1) {
return;
}
if (maze[x][y] == '1') {
return;
}
if (maze[x][y] == 'E') {
maze[x][y] = 'P';
}
if (maze[x][y] == 'P') {
return;
}
if (maze[x][y] == '0') {
maze[x][y] = 'P';
return;
}
if (maze[x][y] == 'B') {
maze[x][y] = 'P';
navigate(x + 1, y);
navigate(x, y + 1);
navigate(x - 1, y);
navigate(x, y - 1);
return;
}
maze[x][y] = 'P';
navigate(x + 1, y);
navigate(x, y + 1);
navigate(x - 1, y);
navigate(x, y - 1);
}
要放下我所做的事情以使其发挥作用。虽然已经有一段时间了,但任何阅读它的人都会发现它有用。
我刚刚创建了数组和这些数组的数组。在存储每个路径的情况下,只选择一个最大数字,但在理想情况下,您应该给它长度行*列(因为这是最大长度)。在找到结束后创建一个。
答案 0 :(得分:0)
尝试添加一个包含特定递归所具有位置的ArrayList,然后一旦点击“O”,就通过ArrayList并使其上的每个位置为最终路径的“F”。然后,在方法结束时,清除所有'P'(可能通过遍历2D数组的每个元素)最后,您有一个或多个用F表示的路径引导您到达终点。
我假设'O'是你的结局位置。
答案 1 :(得分:0)
您需要的唯一标记是:
1 - wall
0 - empty (can use for path)
P - path
现在,让我们开始在起点进行导航:
navigate(xstart, ystart);
我们如何导航?
navigate(int x, int y) {
// Are we there yet?
if (x == xend && y == yend) {
// Yay! We're here! And our path is marked with P's
// However, you're many levels inside the recursion. How to break out?
// Easiest way - throw an exception, and catch in the original caller
}
// Don't step where you're not supposed to
if (x < 0 || x > width - 1 || y < 0 || y > height - 1) {
return;
}
if (maze[x][y] == '1' || maze[x][y] == 'p') {
return;
}
// OK, we can step through here. Let's mark this place as path
maze[x][y] = 'P';
// Now, let's try continuing to neighboring squares
navigate(x + 1, y);
navigate(x, y + 1);
navigate(x - 1, y);
navigate(x, y - 1);
// If we're still here, guess this square is not on the path - remove it
maze[x][y] = '0';
}
(警告:未测试代码,我是C#程序员 - 但应该是相同的)
有趣的测试:
navigate()
来电的顺序会怎样?递归很有趣!你可以得到一个真正的Sack Overflow!