如何在迷宫中回溯...?

时间:2014-11-23 05:09:56

标签: java eclipse recursion maze

所以我正在编写一个程序,让机器人探索迷宫,找到一个指定的洞穴。有四种类型的细胞:洞穴,开始,墙壁和通道。机器人只能移动到通道或洞穴。我实现了我的方法,以便机器人无法移动到访问过的单元格或超出界限。但是一旦它移动到没有有效相邻单元格的单元格,程序就会停止。那么如何让我的机器人回溯到有效细胞的位置呢?我正在使用递归。以下是我的代码。任何帮助都会很棒。谢谢!

public void explore (Cell cavern, Maze maze) throws InterruptedException {
    // for debugging
    System.out.println(row + " " + col);
    System.out.println(cavern.getRow() + " " + cavern.getCol());
    System.out.println(visited.toString());
     TimeUnit.MILLISECONDS.sleep(10); // delay program
    //base case
    if (row == cavern.getRow() && col == cavern.getCol()) {
        foundCavern = true;
        return;
    }
    else {
        // move right
        if ((col+1) < maze.getNumCols() && !visited.contains(maze.getCell(row, col+1)) && (maze.getCell(row, col+1).isPassage() || maze.getCell(row, col+1).isCavern())) {
            visited.add(maze.getCell(row, col+1));
            setRobotLocation(row,col+1);
            explore(cavern, maze);
        }
        // move down
        else if ((row+1) < maze.getNumRows() && !visited.contains(maze.getCell(row+1, col)) && (maze.getCell(row+1, col).isPassage() || maze.getCell(row+1, col).isCavern())) {
            visited.add(maze.getCell(row+1, col));
            setRobotLocation(row+1,col);
            explore(cavern, maze);
        }
        // move left
        else if ((col-1) >= 0 && !visited.contains(maze.getCell(row, col-1)) && (maze.getCell(row, col-1).isPassage() || maze.getCell(row, col-1).isCavern())) {
            visited.add(maze.getCell(row, col-1));
            setRobotLocation(row,col-1);
            explore(cavern, maze);
        }
        // move up
        else if ((row-1) >= 0 && !visited.contains(maze.getCell(row-1, col)) && (maze.getCell(row-1, col).isPassage() || maze.getCell(row-1, col).isCavern())) {
            visited.add(maze.getCell(row-1, col));
            setRobotLocation(row-1,col);
            explore(cavern, maze);
        }
        else {
            foundCavern = false;
            return;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我认为你的方向正确。 我认为你应该做的是继续检查所有方向,除非你找到了洞穴。 由于else子句,您现在只在每次迭代中检查一个方向。因此,当致电explore时,您无法继续检查不同的方向,基本上您不会回溯。 如果您使explore函数返回Boolean字段,表明您是否到达洞穴,更改代码可能会有效:

// move right
if ... // your condition to check if moving right is possible and you didn't visit
// code to move right
found = explore()
//move down if didn't find cavern
if (!found) // and moving down is possible and didn't visit
// code to move down
found = explore()
// keep checking other directions