使用递归的 C++ 中的骑士之旅
knights tour in c++ using recursion
我创建了一个专门用于此目的的 2d 向量的类板。我正在尝试解决骑士之旅。我想在完成后打印出来。使用递归voyagingKnight()函数,我发现它不做任何事情,不打印结果。似乎我想增加递归调用的步骤号,但这不起作用。
向量参数 incs 是用于移动骑士的增量的 2d 向量,在每一行中,第一列中移动一行,第二列中移动一列。
有人对我在这里的推理中的缺陷有任何建议吗?相关代码
bool voyaging_knight( Board &board, int i, int j, int steps ,vector< vector<int> > &increments)
{
if( !newplace(theboard, i, j) ) return false;
board.setval(i,j,step);
if( gone_everywhere( board, steps) )
{
cout <<"DONE" << endl;
board.showgrid();
return true;
}
int n;
int in, jn;
for(n=0; n<8; n++ )
{
in = i + increments[n][0];
jn = j + increments[n][1];
if( inboard(board, i, j)&& newplace(board,i,j) )
{
voyaging_knight( board, in, jn, steps+1 ,increments);
return true;
}
}
theboard.setval(i,j,-1);
}
是的,更改以下内容:
voyagingKnight( theboard, inext, jnext, step+1 ,incs);
return true;
对此:
return voyagingKnight( theboard, inext, jnext, step+1 ,incs);
此外,您似乎需要在函数结束时返回一些东西(可能是false
)。
顺便说一句,我假设您将theboard
中的所有条目初始化为 -1
.
我猜你想要 1 条由回溯找到的(国际象棋)棋盘上的马匹运动产生的连续路径。 在这种情况下,您必须按值传递板,因此您采用的每条路径都有自己的实例要填充。 通过引用传递,每条路径都填满了同一块板,因此您永远无法执行所有步骤。
此外,您应该按值传递结果,并用您访问的位置填充它,并从递归函数返回该结果,因此每个路径都有自己的结果位置实例,通过返回它,您最终会得到最终结果。
您不应该传递 inc,因为它只是一个不会更改的辅助容器。
使棋盘成为全局变量,并在全局变量中构建一系列访问过的正方形。确保在收回每个试探性步骤时撤消任何更改(已访问的正方形,序列的最后一步)。调用你的骑士巡回函数,如果到达终点,让它返回成功,并在完成后进行任何输出。
将整个 shebang 打包在一个文件或类中,以免将私人细节暴露给窥探者。
相关文章:
- 将依赖名称显式标记为类型名和模板的奇怪之处
- 循环无限运行C++解决骑士之旅问题
- 为什么堆栈和堆在内存中分离得如此之多?
- 代码厨师问题伊什瓦拉(应许之地)
- 关于int :0有什么特别之处在C++
- C++ 分而治之的算法问题
- 为什么 Lisp 中 1000 阶乘的计算如此之快(并显示正确的结果)?
- 以下示例中给出的构造有什么不幸之处?
- 在国际象棋骑士巡回赛中遇到困难
- 国际象棋骑士巡回赛使用递归回溯
- 使用分而治之的最大总和子数组,为什么要以不同的方式使用 for 循环,答案是错误的?
- C++用死亡之钻印刷
- 使用堆栈的骑士之旅C++
- 骑士之旅暴力递归
- 骑士之旅 c++ 递归
- 使用递归的骑士之旅
- 使用递归的 C++ 中的骑士之旅
- 骑士之旅异常行为
- 用 c++ 解决骑士之旅
- 使用回溯的代码骑士之旅未显示任何输出