Java递归问题迷宫

时间:2013-03-21 15:27:33

标签: java

我是Java的新手,我正试图通过递归来解决迷宫问题。我在下面添加了部分代码。我有一个包含“字段”的2D数组。墙是1,给出起始坐标和结束坐标。

我有一个问题;

我想在无法继续的情况下擦除路径的位置&结束还没有到达。我该怎么做?

  • 我试过为它添加布尔值
  • 在递归结束时添加迷宫[x] [y] ='0'(空)

但是我无法弄明白,也许我做错了。

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); }

要放下我所做的事情以使其发挥作用。虽然已经有一段时间了,但任何阅读它的人都会发现它有用。

我刚刚创建了数组和这些数组的数组。在存储每个路径的情况下,只选择一个最大数字,但在理想情况下,您应该给它长度行*列(因为这是最大长度)。在找到结束后创建一个。

2 个答案:

答案 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!