Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 所有可能的路径_Java_Artificial Intelligence_Path Finding_Depth First Search - Fatal编程技术网

Java 所有可能的路径

Java 所有可能的路径,java,artificial-intelligence,path-finding,depth-first-search,Java,Artificial Intelligence,Path Finding,Depth First Search,我目前正在开发一个用于玩游戏Dots()的AI。目的是通过将颜色相似的点与线连接,尽可能多地去除点。我已经看完黑板,并用相同的颜色将每组相邻的点分组。所有组当前共享相同的高光颜色(黑色)。例如,左上角的四个红点组成一个组,右上角的三个黄点也是 我需要计算通过其中一个组的所有可能路径。谁能想出一个好的算法?如何避免创建重复路径 我听说在这种情况下稍微修改一下DFS会很好。但是,允许路径在节点处交叉,但不能重用边。如何相应地修改DFS 以下是一些伪代码,让您开始学习。我可能会这样做。使用边而不是节点

我目前正在开发一个用于玩游戏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。我想所有这些路径都是等价的。但是,如果在拐角处有第五个红点,某些路径将无法包含它。因此,我不应该担心重复,直到穷尽搜索已经完成,然后考虑修剪适当。如果我的答案是有益的,不要忘记标记为答案。这基本上是我做了什么。完成后我会发布更多细节