使用递归的 C++ 中的骑士之旅

knights tour in c++ using recursion

本文关键字:骑士 之旅 C++ 递归      更新时间:2023-10-16

我创建了一个专门用于此目的的 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 打包在一个文件或类中,以免将私人细节暴露给窥探者。