所有可能的路径

时间:2014-01-02 17:45:55

标签: java artificial-intelligence path-finding depth-first-search

我目前正致力于玩游戏Dots(link)。目的是通过用线连接相似颜色的点来尽可能多地去除点。我已经通过电路板并将每组相邻的点分组为相同的颜色。这些组目前共享相同的高亮颜色(黑色)。因此,例如,左上角的四个红点形成一个组,右上角的三个黄点也是如此。

我需要通过其中一个组计算每条可能的路径。有谁能想到一个好的算法?我怎么能避免创建重复的路径?

我听说在这种情况下略微修改的DFS会很好。但是,允许路径在节点处交叉,但不能重用边缘。如何相应地修改DFS?

GUI Screenshot

1 个答案:

答案 0 :(得分:1)

这里有一些伪代码可以帮助您入门。这就是我可能会这样做的。使用边而不是节点解决了整齐地交叉路径的情况,但是检索边缘比节点更困难。您需要将边缘索引映射到节点索引。

您将获得两次路径,因为路径可以从两个方向穿过。 如果点组变大,请考虑修剪最不感兴趣的路径。内存需求呈指数增长为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;
}