Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 骑士';s旅游问题汇编不';t端_C++_Algorithm_Recursion_Backtracking_Knights Tour - Fatal编程技术网

C++ 骑士';s旅游问题汇编不';t端

C++ 骑士';s旅游问题汇编不';t端,c++,algorithm,recursion,backtracking,knights-tour,C++,Algorithm,Recursion,Backtracking,Knights Tour,有人能指出代码中的漏洞吗? 我使用的想法是回溯和递归,我想坚持用这种方法来解决给定的问题。当变量移动时,我从研究中记得这个问题。我没有修复它们,但我改变了初始位置,然后第一条路径被更快地找到(这就是我通过这个实验室的方式;P)。这是正常的,因为 路径数太大 但你可以: 按随机顺序从“移动到”中选择 使用多线程 另一方面,您可以阅读有关“约束编程”的内容。未完成编译或未完成运行?cmd.exe在打印两个解决方案后,打印“\ux”,因此,我认为这意味着-未完成运行是我的意思;D.要解决它。编译时

有人能指出代码中的漏洞吗?
我使用的想法是回溯和递归,我想坚持用这种方法来解决给定的问题。当变量移动时,我从研究中记得这个问题。我没有修复它们,但我改变了初始位置,然后第一条路径被更快地找到(这就是我通过这个实验室的方式;P)。这是正常的,因为 路径数太大

但你可以:

  • 按随机顺序从“移动到”中选择
  • 使用多线程

另一方面,您可以阅读有关“约束编程”的内容。

未完成编译或未完成运行?cmd.exe在打印两个解决方案后,打印“\ux”,因此,我认为这意味着-未完成运行是我的意思;D.要解决它。编译时是否启用了优化?您需要添加一个启发式以使其在计算上可行,我似乎记得您应该移动到一个被已访问的方块包围的方块。嗯,选择下一步是否有意义?是否排除上一个方块?如果不存在无限循环,我想用左上角作为起点来解决这个问题,也许以后再进行广义化。我看不出以随机顺序使用move_to如何使程序更快。至于“多线程”部分,你的意思是在CPU上运行,对吗?增加概率,你将平均得到解决方案的时间。添加多个线程可以同时找到多个路径,但您的代码不是线程保存。此外,当存在不可用字段时,您还可以添加约束(例如:字段[0][7]未被访问,但[1][5]和[2][6]被访问。您的程序永远找不到指向[0][7]的路径,但将继续搜索路径)。我不想纯粹靠运气来实现,我只想使算法高效。我已经运行了为moves=60打印解决方案的代码,实际上从未访问过正方形[0][7],但我不理解您的推理。你能详细说明一下吗?你不能实时搜索每一条路径。{-2,-1}、{2,-1}、{-2,1}、{2,1}、{-1,-2}、{1,-2}、{-1,2}、{1,2}尝试将_移动到数组。通过增加概率,你可以避免不幸的移动顺序。约束-打印方式的数量不能小于64。当前移动是{{1,X,0,…,0},{0,0,0,3,0,…,0},{5,2,7,0,…,0},{8,0,4,0,…,0},…,X字段不可用,但您的程序仍将使用此路径。
//checking on which move was the square visited
int board[8][8] = {{1,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0}};
int x = 0;//x and y coordinate of the knight's placement
int y = 0;
//move knight by
int move_to[8][8] = {{1,2},{-1,-2},{-1,2},{1,-2},{2,1},{-2,-1},{-2,1},{2,-1}};
//how many moves have been done
int moves = 0;

void solve()
{
    //printing one solution
    if(moves==63)
    {
        for(int k = 0; k < 8; k++)
        {
            for(int n = 0; n < 8; n++)
                cout << setw(2) << board[k][n] << " ";
            cout << "\n";
        }
        cout << "--------------------\n";
        return;
    }
    else
    {
     for(int i = 0; i < 8; i++)
    {
        //checking if knight is not leaving the board
        if(x+move_to[i][0]<0 || x+move_to[i][0]>7 || y+move_to[i][1]<0 ||
            y+move_to[i][1]>7 || board[x+move_to[i][0]][y+move_to[i][1]]>0)
            continue;
        //moving theknight
        x+=move_to[i][0];
        y+=move_to[i][1];
        //increasing the moves count
        moves++;
        //marking the square to be visited
        board[x][y] = moves+1;
        //backtracking
        solve();
        board[x][y] = 0;
        x-=move_to[i][0];
        y-=move_to[i][1];
        moves--;
    }
    }
}

int main()
{
    solve();

    return 0;
}