计算给定距离的所有可能路径

时间:2016-02-02 05:09:57

标签: java algorithm

我有一个用Java编写的路径查找功能,需要一些工作。

我有一系列弹簧棍,每个都有自己的跳跃距离"。例如,具有值5的弹簧针可以"跳跃" (移动)5个空格。我还有一个totalDistance变量,用于保存需要移动的距离。

用户通过键盘提供输入,其中第一个整数是距离,剩余的整数是pogo棒距离。可以根据需要多次使用相同的弹簧棍,同样地,弹跳棍的移动距离大于1。不需要totalDistance。

我的算法几乎按预期工作,虽然它会跳过某些组合,因为循环的迭代首先找到不同的算法,因此忽略了其他路径的潜力。

我需要基本上检查一下路径是否已经计算过,然后忽略弹跳杆的当前迭代并移动到下一个。

有人可以帮忙吗?下面是我查找路径的算法。

/*
 * First integer in input
 */
int totalDistance;

/*
 * The remaining integers in the input
 */
ArrayList<Integer> pogoSticks = new ArrayList<Integer>();


private void findPaths() {
    ArrayList<ArrayList<Integer>> possibleSticks = new ArrayList<ArrayList<Integer>>();

    for (int i = 0; i < pogoSticks.size(); i++) {

        int pogoStickDistance = pogoSticks.get(i);

        if (pogoStickDistance == totalDistance) {
            if (!possibleSticks.contains(new ArrayList<Integer>(pogoStickDistance))) {
                ArrayList<Integer> list = new ArrayList<Integer>();
                list.add(pogoStickDistance);
                possibleSticks.add(list);
            }
        } else if (pogoStickDistance < totalDistance) {
            int remainingDistance = totalDistance;
            ArrayList<Integer> possibleSubSticks = new ArrayList<Integer>();

            possibleSubSticks.add(pogoStickDistance);
            remainingDistance -= pogoStickDistance;

            for (int j = 0; j < pogoSticks.size(); j++) {

                int pogoStickDistance1 = pogoSticks.get(j);
                if (pogoStickDistance1 == remainingDistance) {
                    System.out.println(remainingDistance);
                    possibleSubSticks.add(pogoStickDistance1);

                    possibleSticks.add(possibleSubSticks);
                    break;
                } else if (pogoStickDistance1 < remainingDistance) {
                    possibleSubSticks.add(pogoStickDistance1);
                    remainingDistance -= pogoStickDistance1;
                }

                if (j == (pogoSticks.size() - 1) && pogoStickDistance1 != remainingDistance) {
                    j = 0;
                }
            }
        }

    }

    System.out.println(possibleSticks);
}

输出:

Enter input: 5 5 10 1 3
[[5], [1, 1, 3], [3, 1, 1]]

前5个是距离,其他数字是pogo棒距离。

我遗漏了诸如[1, 1, 1, 1, 1][1, 3, 1]

之类的路径

1 个答案:

答案 0 :(得分:0)

您可以在此处查看探索解决方案所有可能路径的二叉树enter image description here

如果totaldistance = 5并且你有两种1和3的棒,那么你可以看到已经达到解决方案的路径和已经超出解决方案的路径,无需进一步考虑。

这个问题可以通过探索树来解决(在你有n种棍子的情况下它可能是n-ary树)。解决方案通常可以通过广度优先搜索或深度优先搜索找到 - 您需要使用某种类型的队列或堆栈。因此,您需要废弃解决方案并重新开始。