在Java中寻路,踩到每个瓷砖一次

时间:2015-11-06 15:19:14

标签: java algorithm pathfinder

我目前在拼贴地图上遇到路径寻找问题:我有一个ArrayList<ArrayList<Byte>>,它确定list.get(y).get(x)处的拼贴是否被阻挡,以及起始位置。现在我想知道是否有一条路径,从原点开始,经过每个非阻塞区块一次,如果有,我希望打印路线和,#NW; NWWEW&#39;。我已经通过使用 floodfill 检查每个未阻止的磁贴是否连接到所有其他磁贴(因此,应该只有一个连接的非阻塞磁贴区域),但我仍然需要关于如何继续使用“路径 - 但每个只有一次只有一次”的事情的想法。

如果有人有任何想法或算法,我会感谢答案

编辑好吧,我想我已经知道了,但是由于问题已经结束,我必须在这里写出解决方案:

(感谢@Jack指出我正确的方向)首先,程序检查当前的瓷砖是否可以走路;然后将其标记为已访问,并将其访问方向添加到directions-string。之后,我以递归方式为每个方向调用此函数,直到total-directions-string的长度等于整个地图上可访问图块的总 -1 。如果它不相等,它将删除自己被访问的方向并返回上层。

代码:

public static void findPath(int x, int y, String direction){

    if(pathFound)
        return;

    if(map.get(y).get(x) == 0){

        map.get(y).set(x, (byte) 1);

        directions += direction;

        findPath(x, y-1, "N");
        findPath(x, y+1, "S");
        findPath(x-1, y, "W");
        findPath(x+1, y, "O");

        if(directions.length() == totalFreeTiles-1){
            pathFound = true;
            return;
        }

        if(directions.length() > 0)
            directions = directions.substring(0, directions.length()-1);

        map.get(y).set(x, (byte) 0);

    }
}

2 个答案:

答案 0 :(得分:1)

您可以通过实施回溯算法来实现目标。

我会使用两个全局变量:结果字符串(让我们称之为“方向”初始化为空)和一个三态类型的矩阵(我们称之为“矩阵”)。那就是:

  • 尚未访问的瓷砖
  • Tile已经访问过
  • 通过启动参数
  • 阻止平铺

然后实现一个例程,该例程给出一个瓦片和一个用于到达它的方向,递归地探索相邻的瓦片。 例程应该这样做:

  • 如果已访问或阻止了磁贴,则返回
  • 如果图块可见,请将矩阵[current-tile]标记为已访问
  • 通过添加用于到达此图块的方向来更新“方向”
  • 如果没有更多免费瓷砖,则打印“方向”并赢得
  • 否则以递归方式调用所有8个相邻图块上的例程
  • 然后从“方向”移除最后一个方向,将矩阵[current-tile]标记为尚未访问并返回

作为例程的原型,我建议使用索引矩阵,这样您就可以轻松检查矩阵边界

答案 1 :(得分:0)

不确定我是否正确理解它,所以这就是我想你想做的事情:

你有一个阻挡方式的Matrix X * Y.你不在乎如何,但是你想知道从A位到B位的方式是否存在,这会引导你通过矩阵触及每个瓷砖的方式?很抱歉,如果这很明显,但我想重复它,因为我第一次读它是&#34;迭代矩阵并给我任何路径&#34;。

对我而言,这听起来像是一种回溯算法。 https://en.wikipedia.org/wiki/Backtracking

从位置X(左上角)开始然后再迈出一步。然后,您的接受方法会检查:

(a)这块瓷砖被封了吗?  (b)我已经来过这里了吗?

如果这两个条件都返回false,则踩下该图块并将其标记为&#34;踩到&#34;。如果您回答其中任何一个问题是&#34;是&#34;,您可以尝试不同的图块。如果没有留下任何图块,则单步执行上一个图块。如果您到达目的地,您已找到路径并可以打印它。如果你回溯到你的原点并且没有更多的步骤,那就没有办法了。