解决JAVA中的挑战。挑战在下面的描述中提到。我面临的逻辑错误也在下面的说明中

时间:2015-12-01 18:04:11

标签: java

Lukáš非常喜欢定向越野,这项运动需要在崎岖的地形中找到控制点。为了娱乐NWERC参与者,Lukáš希望组织定向越野比赛。然而,在瑞典11月的寒冷天气中,参加者在户外活动太过苛刻,所以他决定跳上室内比赛的新趋势,并在林雪平大学B楼内举行比赛。

卢卡斯已经确定了控制点的位置。他还决定了比赛的确切时间长度,因此唯一剩下的就是决定应该按照哪个顺序访问控制点,以便总比赛的长度符合他的意愿。因为这并非总是可行,所以他要求你写一个程序来帮助他。

输入格式

输入包括:

一行有两个整数n(2≤n≤14)和L(1≤L≤1015),控制点的数量和所需的种族长度; n行,每行n个整数。第i行上的第j个整数dij表示控制点i和j之间的距离(1≤dij≤L,i 6 = j,dii = 0)。对于所有1≤i,j,k≤N,情况是dij = dji和dij≤dik+ dkj。 输出格式

如果可以按某种顺序访问所有控制点,则输出一行“可能”,并直接返回第一行,使总距离正好为L,否则为“不可能”。

示例输入

3 5
0 1 3
1 0 3
4 1 0

示例输出

possible

代码的问题是函数 checkscenario()的else循环中的for循环只考虑第一次迭代并返回false作为结果。它不检查将返回true的下一次迭代,从而给出正确的解决方案。

让我们使用示例输入进行说明。最初,该函数获取参数的值如下: -

controlptsleft = {0,1,2,3}

  

//这些是尚未访问过的控制点。

index = 0;

  

//这是我所掌握的控制点。

controlmatrix =

0 1 3
1 0 3
4 1 0

L = 5

  

//所需的长度。

sum = 0

  

//直到现在我们还没有落后控制点。所以,sum = 0。

    public static boolean checkscenario(ArrayList<Integer> controlptsleft, int index, int[][] controlmatrix, int L, int sum){
        int row = controlptsleft.get(index);
        //row stores the value in the ArrayList controlptsleft at the index.
        controlptsleft.remove(index);
        //The controlpt is removed. The first time 0 will be removed from arrayList controlptsleft.
        if(controlptsleft.isEmpty()){
            //When the ArrayList controlptsleft is empty, we have to go back to the first controlflag.
            int temp = controlmatrix[row][0];
            //temp stores the distance between the control flag where we are at and the starting control flag.
            if(L == (sum + temp))
                return true;
        }
        else{
            for(int i=0;i<controlptsleft.size();i++){
                int temp = controlmatrix[row][controlptsleft.get(i)];
                //temp stores the distance between the control flag where we are at and the whatever controlflag we get during the iteration.
                ArrayList<Integer> tempList = controlptsleft;
                boolean finalres = checkscenario(tempList,i,controlmatrix,L,(sum + temp));
                //Here, i is sent so that when it enters the function again the index i (along with the value) in ArrayList tempList will be deleted.
                if(finalres)
                    return true;
            }
        }
        return false;
    }

1 个答案:

答案 0 :(得分:0)

以防万一有人想知道,我找到了应对这一挑战的答案。

首先,我要感谢 Hanno Binder 。我意识到我哪里出错了。

checkcenario

的函数的else循环中
else{
        for(int i=0;i<controlptsleft.size();i++){
        int temp = controlmatrix[row][controlptsleft.get(i)];
        ArrayList<Integer> tempList = controlptsleft;
        boolean finalres = checkscenario(tempList,i,controlmatrix,L,(sum + temp));
        if(finalres)
            return true;
    }

我做的是,我直接将 controlptsleft 的引用复制到 tempList 。我意识到了这个错误,而是初始化 tempList 并使用 .addAll 来放置中的所有值 controlptsleft tempList 。 以下代码说明了我的意思。

else{
        for(int i=0;i<controlptsleft.size();i++){
            int temp = controlmatrix[row][controlptsleft.get(i)];
            ArrayList<Integer> tempList = new ArrayList<Integer>();
            tempList.addAll(controlptsleft);
            boolean finalres = checkscenario(tempList,i,controlmatrix,L,(sum + temp));
            if(finalres)
                return true;
        }
    }

如果有人在JAVA中有更好的解决方案来应对上述挑战。随意发布他们的代码,这样我就可以学习如何编写更好的代码。