使用递归的 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++ 中的骑士之旅的主要内容,如果未能解决你的问题,请参考以下文章

骑士之旅中的堆栈实现[关闭]

骑士之旅蛮力

使用递归的骑士的目的地

骑士游历C语言递归,请大家帮忙看下哪里错了,谢谢

极其简单的递归——骑士与金币

每天刷个算法题20160523:骑士巡游的递归转非递归解法