所以我正在編寫一個程序,讓一個機器人探索一個迷宮來找到一個指定的洞穴。有四種類型的單元格:洞穴,開始,牆壁和通道。機器人只能移動到通道或洞穴。我實施了我的方法,以便機器人不能移動到訪問的單元格或出界。但一旦移動到沒有有效的相鄰單元的單元格,程序就會停止。那麼,如何讓我的機器人回溯到有效單元的位置?我爲此使用遞歸。以下是我的代碼。任何幫助都會很棒。謝謝!如何在迷宮中追溯...?
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;
}
}
}
而不是使用遞歸的,它可能是簡單的只是保持你在做的動作一個堆棧。 – azurefrog 2014-11-23 05:11:48
那麼我的訪問列表應該是一個堆棧呢?我有點爲什麼,但你能給我一些更多的細節。像,我應該在哪裏彈出我的代碼? – JOH 2014-11-23 05:20:14
我認爲你應該擺脫'else',而是檢查你是否還需要繼續其他方向,這意味着當你從「探索」調用返回時,你仍然沒有找到洞穴 – benji 2014-11-23 05:21:32