使用递归的 C++ 中的骑士之旅
Posted
技术标签:
【中文标题】使用递归的 C++ 中的骑士之旅【英文标题】:knights tour in c++ using recursion 【发布时间】:2014-03-05 08:56:27 【问题描述】:我创建了一个专门为此目的处理 2d 向量的类 Board。我正在尝试解决骑士之旅。我想在完成后打印出来。使用递归 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);
【问题讨论】:
这将是一个普通棋盘上 64 次调用的非常深的递归。您确定不想只使用循环吗? 【参考方案1】:是的,改变这个:
voyagingKnight( theboard, inext, jnext, step+1 ,incs);
return true;
到这里:
return voyagingKnight( theboard, inext, jnext, step+1 ,incs);
另外,好像还需要在函数末尾返回一些东西(可能是false
)。
顺便说一句,我假设您已将 theboard
中的所有条目初始化为 -1
。
【讨论】:
【参考方案2】:我猜你想要通过回溯找到的(棋盘)棋盘上的马移动形成的 1 条连续路径。在这种情况下,您必须按值传递板,因此您采用的每条路径都有自己的实例要填充。通过引用传递,每条路径都填满了同一块板,因此您永远无法走完所有步骤。
您还应该按值传递结果,并用您访问的位置填充它,然后从递归函数中返回它,因此每个路径都有自己的结果位置实例,通过返回它,您最终得到最终结果。
你不应该传递 inc 因为那只是一个不会改变的辅助容器。
【讨论】:
我更新了我的答案,因为我误解了传递的 inc 作为结果。您在到达最后一个位置时显示结果(一个完整的成品板),但对于回溯,理想情况下,您从递归函数返回一个结果。【参考方案3】:将棋盘设为全局变量,并在全局变量中构建一系列访问过的方块。确保在撤回每个暂定步骤时撤消任何更改(已访问的正方形,序列的最后一步)。调用你的骑士的游览函数,到达终点返回成功,完成后做任何输出。
将整个shebang打包成一个文件或一个类,以免将私人细节暴露给窥探。
【讨论】:
以上是关于使用递归的 C++ 中的骑士之旅的主要内容,如果未能解决你的问题,请参考以下文章