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;
}
答案 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中有更好的解决方案来应对上述挑战。随意发布他们的代码,这样我就可以学习如何编写更好的代码。