【问题标题】:knights tour in c++ using recursion使用递归的 C++ 中的骑士之旅
【发布时间】: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 次调用的非常深的递归。您确定不想只使用循环吗?

标签: c++ recursion knights-tour


【解决方案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打包成一个文件或一个类,以免将私人细节暴露给窥探。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多