我的回溯代码中的错误 - 过桥
Bug in my backtracking code - Bridge Crossing
我正在尝试学习回溯,为此我选择了TopCoder问题之一 - 它被称为BridgeCrossing。我们有1-6个人试图在晚上过桥,他们之间有一个手电筒。最多2个人可以一次过桥,当他们这样做时,至少其中一个必须有手电筒,否则他们什么也看不到......
答案是一个函数,它给定一个vector <int> times
,其中times[i-1]
表示第 i 个人过桥所需的时间(当 2 个人过桥时,他们的时间来自较慢的人)。此外,当我们在桥的另一边有手电筒并且仍然有一些人需要过桥时 - 一个人必须带着手电筒返回才能引导他们通过。
这是我的解决方案(所有出现的vector <int>
都变成了VI
):
int backtrack(VI times){
if (times.empty()) return 0;
if (times.size() == 1) return times[0];
if (times.size() == 2) return max(times[0], times[1]);
VI results;
for (int i = 0; i < times.size(); i++){
for (int j = 0; j < i; j++){
VI people_left1;
for (int k = 0; k < times.size(); k++){
if (k != i && k != j){
people_left1.push_back(times[k]);
}
}
people_left1.push_back(min(times[i], times[j]));
results.push_back(backtrack(people_left1)+
max(times[i], times[j]) + min(times[i], times[j]));
}
for (int j= i + 1; j < times.size(); j++){
VI people_left;
for (int k = 0; k < times.size(); k++){
if (k != i && k != j){
people_left.push_back(times[k]);
}
}
people_left.push_back(min(times[i], times[j]));
results.push_back(backtrack(people_left)+
max(times[i], times[j]) + min(times[i], times[j]));
}
}
int res = INT_MAX;
for (int i = 0; i < results.size(); i++){
if (results[i] < res){
res = results[i];
}
}
return res;
}
从理论上讲,它应该运行良好 - 我正在挑选所有可能的索引对 i,j,引导一个人(时间更大),与一个人一起返回并在剩下的人上递归。不幸的是它不起作用 - 对于输入{1,2,5,10}
它应该返回 17,但我的函数输出 19。
我已经盯着这段代码很长时间了,但我仍然看不到任何错误。一个人可以躲在哪里?另外,调试此类递归函数的技术是什么,因为我在这样做时遇到了很长一段时间的问题。
问题是你不认为一个已经留在另一边的人将来可以带着手电筒回来。在示例案例中,2 号人员在一段时间后返回。基本上,i,j对中的人并不总是会带着手电筒返回。
不是真正的答案,但通过这样做,您的代码可能更具可读性:
for (int j = 0; j < times.size(); j++){
if (j != i) {
.. all that code inside both loops
}
}
也许这会更容易找到您的问题。
有时,可以通过打印根据递归级别缩进的信息来调试递归代码。为此,您必须添加一个向下传递每个级别的变量。在调低级别时递增它。
method(int level, ...) {
if (recursing needed) {
print(spaces(level * 3) + "recursing");
method(level + 1);
}
}
相关文章:
- 当我使用 osgDB::readNodeFile 时,如何跳过错误的 osgb 文件?
- 如何在我使用过的Arduino库之一中固定构造函数中的转换错误
- 跳过列表C++分段错误
- 为什么用于输入验证的 while 循环要么完全跳过循环,要么不考虑错误的输入
- 在桥接头中导入头文件导致的 Swift 编译器错误
- 当使用固定大小矩阵的“std::vector”时,常春藤桥上的 AVX 的特征段错误
- 在beaglebone black上使用arm-linux-gnueabihf时跳过不兼容错误
- C++错误 C2535,即使我曾经使用过杂注
- 运行时间错误:程序跳过提示,以获取第二名和第三个名称
- 跳过初学者C++功能:没有错误
- 我的回溯代码中的错误 - 过桥
- 错误 C2361:标签跳过'found' 'default'初始化
- 如何轻松解决Wsock2上的10040消息过长错误
- 我从未见过的编译器错误有人可以帮助我理解它吗?
- 由于错误条件,构建目标被跳过;("@(条件名称此处)" - 不确定如何更改
- 读取十六进制文件会产生错误的输出(跳过一些十六进制值)
- Linker给出了一个我在应用程序中根本没有使用过的函数的错误
- TDM-GCC抛出错误:对我从未调用过的方法的未定义引用
- c++语法错误跳过__namespace
- 在c++ Builder类中定义默认函数参数和参数过少错误