迷宫解决算法卡在两个地方之间

时间:2014-04-16 18:23:00

标签: java algorithm maze

我正在尝试制作一个程序(用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;
        }
    }

}

2 个答案:

答案 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迷宫的出口,其中入口和出口都在外墙上。