我目前在拼贴地图上遇到路径寻找问题:我有一个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);
}
}
答案 0 :(得分:1)
您可以通过实施回溯算法来实现目标。
我会使用两个全局变量:结果字符串(让我们称之为“方向”初始化为空)和一个三态类型的矩阵(我们称之为“矩阵”)。那就是:
然后实现一个例程,该例程给出一个瓦片和一个用于到达它的方向,递归地探索相邻的瓦片。 例程应该这样做:
作为例程的原型,我建议使用索引矩阵,这样您就可以轻松检查矩阵边界
答案 1 :(得分:0)
不确定我是否正确理解它,所以这就是我想你想做的事情:
你有一个阻挡方式的Matrix X * Y.你不在乎如何,但是你想知道从A位到B位的方式是否存在,这会引导你通过矩阵触及每个瓷砖的方式?很抱歉,如果这很明显,但我想重复它,因为我第一次读它是&#34;迭代矩阵并给我任何路径&#34;。
对我而言,这听起来像是一种回溯算法。 https://en.wikipedia.org/wiki/Backtracking
从位置X(左上角)开始然后再迈出一步。然后,您的接受方法会检查:
(a)这块瓷砖被封了吗? (b)我已经来过这里了吗?
如果这两个条件都返回false,则踩下该图块并将其标记为&#34;踩到&#34;。如果您回答其中任何一个问题是&#34;是&#34;,您可以尝试不同的图块。如果没有留下任何图块,则单步执行上一个图块。如果您到达目的地,您已找到路径并可以打印它。如果你回溯到你的原点并且没有更多的步骤,那就没有办法了。