用JAVA解决一个难题。下面的描述中提到了挑战。我面临的逻辑错误也在下面的描述中
卢卡什非常喜欢定向运动,这项运动需要在崎岖的地形上确定控制点。为了娱乐NWERC参与者,卢卡什想组织一场定向比赛。然而,在瑞典11月这样寒冷的天气里,参赛者在室外太难了,因此他决定跳上室内比赛的新潮流,将比赛安排在林克平大学B楼内进行 卢卡什已经决定了控制点的位置。他还决定了比赛的确切长度,所以剩下的唯一事情就是决定访问控制点的顺序,以便整个比赛的长度符合他的意愿。因为这并不总是可能的,他要求你写一个程序来帮助他 输入格式 输入包括: 一行两个整数n2≤ N≤ 14和L 1≤ L≤ 1015,控制点的数量和比赛的预期长度; n行,每个行有n个整数。第i行上的第j个整数dij表示控制点i和j1之间的距离≤ dij≤ L表示i6=j,而dii=0。全部1≤ i、 j,k≤ N情况是dij=dji和dij≤ dik+dkj。 输出格式 如果可以按某种顺序访问所有控制点一次,并直接返回到第一个控制点,使总距离正好为L,则输出一行“可能”,否则为“不可能” 样本输入用JAVA解决一个难题。下面的描述中提到了挑战。我面临的逻辑错误也在下面的描述中,java,Java,卢卡什非常喜欢定向运动,这项运动需要在崎岖的地形上确定控制点。为了娱乐NWERC参与者,卢卡什想组织一场定向比赛。然而,在瑞典11月这样寒冷的天气里,参赛者在室外太难了,因此他决定跳上室内比赛的新潮流,将比赛安排在林克平大学B楼内进行 卢卡什已经决定了控制点的位置。他还决定了比赛的确切长度,所以剩下的唯一事情就是决定访问控制点的顺序,以便整个比赛的长度符合他的意愿。因为这并不总是可能的,他要求你写一个程序来帮助他 输入格式 输入包括: 一行两个整数n2≤ N≤ 14和L 1≤ L≤ 1015,控
3 5
0 1 3
1 0 3
4 1 0
样本输出
possible
代码的问题在于,checkscenario函数的else循环中的for循环只考虑第一次迭代,结果返回false。它不会检查下一次迭代,下一次迭代将返回true,从而给出正确的解决方案
让我们使用示例输入进行解释。最初,函数获取参数值,如下所示:-
controlptsleft={0,1,2,3}
//这些是尚未访问的控制点
指数=0
//这是我所在的控制点
控制矩阵=
0 1 3
1 0 3
4 1 0
L=5
//所需的长度
总和=0
//到目前为止,我们还没有落后于控制点。所以,sum=0
万一有人想知道,我想出了这个挑战的答案 首先,我要感谢汉诺·宾德的评论。我意识到我错在哪里了 在函数checkscenario的else循环中 我所做的是,我直接将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解决方案来应对上述挑战。请随意发布他们的代码,这样我就可以学习如何更好地编写代码。你最好将关于作业的样板文章从问题中删除,只关注你真正关心的部分。我只是略读了一下,并仅基于这一点对您的提问进行了假设,这并不是很好,但无论如何都很常见。使用非描述性变量名(例如n、L、temp)跟踪此代码非常困难。如果您更改它,则更容易理解。controlptsleft.removeindex;forint i=0;我
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;
}
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;
}
}