使用左手规则解决迷宫

时间:2010-12-06 02:22:05

标签: java maze

我正在尝试使用下面的sudo代码使用左手退出规则解决迷宫 我已经让它工作了,但是我遇到的问题是当它遇到一个死胡同并且回来时选择一个新的方向(就像一个正方形的情况,其顶部是真的但是左边,底部和右边的墙是假的第一阶段我的代码正确移动,如果输入是左边的2或者是底部或右边的任何一个,但是当它返回时它选择左方向而不是底部,我如何选择底部)。

有人可以告诉我如何选择新的方向 - 我已经在你的参考方法周围放了双星号(**) 提前谢谢

Set int entr to LEFT;
Set int exit to-1;
Set boolean backtrack to false;
Set currentSquare to startingSquare;
Set previousSquare to null;
Set currentSquare.onpath to true;
While (currentSquare != endingSquare) {
    **Set exit to currentSquare.getLeftHandExit(entr);**
    Set previousSquare to currentSquare;
    Set currentSquare to currentSquare.adjacentSquare(exit);
    If (backtracking is false and exit is same as entrance)
        Set backtracking to true;
        Remove previousSquare from path;
    }
    Else if backtracking is true and currentSquare is not on the path
        Set backtracking to false;
        Add previousSquare to path;
    }
    If backtracking is true, remove currentSquare from path;
    else add currentSquare to path;
    entr = currentSquare.oppositeSide(exit);
} // end of While

2 个答案:

答案 0 :(得分:1)

使用回溯系统;是通过使用递归方法(不是优选的)还是使用堆栈来返回步骤。理想情况下,您还要在算法选择的每个交汇点中设置标记,因此您不要再选择相同的路径(在给定的交汇点中仅选择未标记的路径)

维基百科有一些关于如何实现这一点的nice pseudocode。注意“递归回溯”算法,用“从一个未访问的邻居中选择左转”替换“随机选择其中一个未访问的邻居”(意味着从左侧单元格中选择顺时针方向)。

另外,请查看有关递归的this e-book

我会选择(未经测试的代码):

maze.clearAllVisited();
Stack<Point> paths = new Stack<Point>();
int x = maze.getStartX();
int y = maze.getStartY();
while (!maze.isExit(x, y)) {
   maze.setVisited(x, y);
   if (maze.canGoWest(x, y)) {    // check if west cell is accessible from x,y and has not been visited
      paths.push(new Point(x, y));
      x--;
   } else if (maze.canGoNorth(x, y)) { // check if north cell is accessible from x,y and has not been visited
      paths.push(new Point(x, y));
      y--;
   } else if (maze.canGoEast(x, y)) {  // ...
      paths.push(new Point(x, y));
      x++;
   } else if (maze.canGoSouth(x, y)) { // ...
      paths.push(new Point(x, y));
      y++;
   } else {
      if (paths.isEmpty()) {
         break;  // no more path for backtracking, exit (aka no solution for maze)
      }
      // dead end! go back!
      Point last = stack.pop();
      x = last.x;
      y = last.y;
   }   
}

答案 1 :(得分:1)

如果你总是向左转,那么只需转身,你应该改变方向,所以你的左侧会改变到右侧。

当你到达下一个走廊时,你仍然会向左转。

我认为这只是将你的左手放在墙上,你最终会找到出路。

根据迷宫的复杂程度,可以设计一个迷宫,你最终会进入循环,所以你可能想要改变你曾经去过的地方的颜色,以便你可以检测到你走过的时候部分,或者我再次重复你的道路。