我正在尝试制作一个程序(用Java)来解决迷宫作为学校项目的一部分。我差不多完成了,但我的算法似乎有问题。我正在使用右手规则,但由于我的迷宫的制作方式,并不总是有一面墙(见图片? - 不完全是我的,但非常相似http://upload.wikimedia.org/wikipedia/commons/2/28/Prim_Maze.svg)。因此,该算法只是在相同的两个地方之间来回反弹。任何有关如何避免此问题的提示/提示/帮助将不胜感激!先感谢您!这是我正在使用的代码:
public void solve(){
/*if you can go right go right
else if you can go forward go forward
else if you can go left go left
else if you can go back go back */
int direction = 0; //0=down, 1=right, 2=up, 3=left
int lastXSquare = 0;
int lastYSquare = 0;
for (int i = 0; i < 100; i++) {
tryDirection(direction);
hasMoved = false;
direction = 0;
if(lastXSquare == xSquareLocation && lastYSquare == ySquareLocation){
tryDirection(++direction);
hasMoved = false;
direction = 0;
}
}
if(solution[xSquareLocation][ySquareLocation]){
lastXSquare = xSquareLocation;
lastYSquare = ySquareLocation;
direction++;
}
//if we get stuck between two, change the starting direction to try and break out of the loop
// *****NOT WORKIKNG***
for (int i = 0; i < 100; i++) {
tryDirection(direction);
hasMoved = false;
direction = 0;
if(lastXSquare == xSquareLocation && lastYSquare == ySquareLocation){
tryDirection(++direction);
hasMoved = false;
direction = 0;
}
}
}
private void tryDirection(int direction){
if(direction == 0){
moveVertically(1);
if(hasMoved){
if(solution[xSquareLocation][ySquareLocation]){
moveVertically(-1);
direction++;
}
else
solution[xSquareLocation][ySquareLocation] = true;
}
else{
direction++;
}
}
if(direction == 1){
moveHorizontally(1);
if(hasMoved){
if(isSolved()){ return; }
if(solution[xSquareLocation][ySquareLocation]){
moveHorizontally(-1);
direction++;
}
else
solution[xSquareLocation][ySquareLocation] = true;
}
else{
direction++;
}
}
if(direction == 2){
moveVertically(-1);
if(hasMoved){
if(solution[xSquareLocation][ySquareLocation]){
moveVertically(1);
direction++;
}
else
solution[xSquareLocation][ySquareLocation] = true;
}
else{
direction++;
}
}
if(direction == 3){
moveHorizontally(-1);
if(hasMoved){
if(solution[xSquareLocation][ySquareLocation]){
moveHorizontally(1);
direction++;
}
else
solution[xSquareLocation][ySquareLocation] = true;
}
else{
direction = 0;
}
}
}
答案 0 :(得分:1)
似乎你正在做DFS 的某些变化 - 你正在探索迷宫上的“分支”(单一路径),并希望找到解决方案。
然而, DFS未完成。如果路径存在,则无法保证找到路径,并且可能会陷入无限循环。这是您正在观察的行为。
另外 - 它不是最佳 - 即使它找到的路径也不能保证是最好的(最短的)。
解决此问题的最佳和完整算法是BFS。
在BFS中,您可以探索深度为1的所有可能移动,然后是深度2,依此类推,等等。
还有更多高级算法,例如A* search algorithm(可能带有manhattan distance heuristic)和bi-directional search,但您应该暂时坚持使用更简单的BFS。
答案 1 :(得分:0)
我认为你的问题是你并没有真正遵循右手规则。该规则应根据您的方向进行解释,而您似乎是相对于全球方向进行解释。
你应该做的是:
If I can move left - turn left and step forwards
else If I can move forwards - step forwards
else If I can move right - turn right and step forwards
else turn right
左,前,右相对于您当前的方向。
该算法可以简化为:
repeat
If I could move left then
turn left
else
if I can move forwards then
move forwards
else
turn right
until exit reached
这应该找到任何2D迷宫的出口,其中入口和出口都在外墙上。