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;
}