Java 所有可能的路径
我目前正在开发一个用于玩游戏Dots()的AI。目的是通过将颜色相似的点与线连接,尽可能多地去除点。我已经看完黑板,并用相同的颜色将每组相邻的点分组。所有组当前共享相同的高光颜色(黑色)。例如,左上角的四个红点组成一个组,右上角的三个黄点也是 我需要计算通过其中一个组的所有可能路径。谁能想出一个好的算法?如何避免创建重复路径 我听说在这种情况下稍微修改一下DFS会很好。但是,允许路径在节点处交叉,但不能重用边。如何相应地修改DFSJava 所有可能的路径,java,artificial-intelligence,path-finding,depth-first-search,Java,Artificial Intelligence,Path Finding,Depth First Search,我目前正在开发一个用于玩游戏Dots()的AI。目的是通过将颜色相似的点与线连接,尽可能多地去除点。我已经看完黑板,并用相同的颜色将每组相邻的点分组。所有组当前共享相同的高光颜色(黑色)。例如,左上角的四个红点组成一个组,右上角的三个黄点也是 我需要计算通过其中一个组的所有可能路径。谁能想出一个好的算法?如何避免创建重复路径 我听说在这种情况下稍微修改一下DFS会很好。但是,允许路径在节点处交叉,但不能重用边。如何相应地修改DFS 以下是一些伪代码,让您开始学习。我可能会这样做。使用边而不是节点
以下是一些伪代码,让您开始学习。我可能会这样做。使用边而不是节点解决了路径整齐交叉的情况,但检索边比检索节点更困难。您需要将边缘索引映射到节点索引 您将获得每条路径两次,因为一条路径可以从两个方向穿过。 如果点群变大,考虑修剪最不有趣的路径。内存需求呈指数增长,为4^n,其中n是组中的点数。我想不出一个好方法来添加不完整的路径而不允许重复,但也许您对提前结束的路径不感兴趣
private LinkedList<Edge> recurse(LinkedList<Edge> path) {
Edge last = path.getLast();
Edge right = <get Edge to the right of last>;
Edge bottom = <get Edge below last>;
Edge left = <get Edge to the left of last>;
Edge top = <get Edge above last>;
if( right && !path.contains(right) ) {
LinkedList<Edge> ps = path.clone(); // NOTE: check if the built-in clone() function does a shallow copy
ps.addLast( right );
paths.add( recurse(ps) );
}
if( bottom && !path.contains(bottom) ) {
...
}
if( left && !path.contains(left) ) {
...
}
if( top && !path.contains(top) ) {
...
}
return path;
}
私有链接列表递归(链接列表路径){
最后一个边=path.getLast();
右边缘=;
边底=;
左边缘=;
边顶=;
if(right&&!path.contains(right)){
LinkedList ps=path.clone();//注意:检查内置的clone()函数是否执行浅层复制
ps.addLast(右);
添加(递归(ps));
}
if(底部&&!path.contains(底部)){
...
}
if(左&&!path.contains(左)){
...
}
if(top&&!path.contains(top)){
...
}
返回路径;
}
什么构成重复路径?如果A、B、C、D是2x2正方形模式中的节点,这些路径中是否有重复的?A-B-C-D,B-C-D-A,C-D-A-B,D-C-B-A。我想所有这些路径都是等价的。但是,如果在拐角处有第五个红点,某些路径将无法包含它。因此,我不应该担心重复,直到穷尽搜索已经完成,然后考虑修剪适当。如果我的答案是有益的,不要忘记标记为答案。这基本上是我做了什么。完成后我会发布更多细节