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