我试图制作一个骑士旅游问题解决方案,我刚刚做到了。现在我想改进它。它取起始值,然后输出逐步指令移动(在命令行输出中)。
现在我使用的技术是首先根据视频中给出的解决方案将电路板划分为4个块 (这里www.youtube.com%2Fwatch%3Fv%3DdWM5pKYZCHw& b = 28)并且还将整个板分成4个盒子系统。
在解决方案中,我必须做很多回溯来决定两种不同的可能性,这大大降低了速度。有没有办法做更少或没有回溯来决定两种可能性。以及任何其他改进技术的建议。 这是代码的一部分(一个将骑士移到棋盘上的功能)
void move(int l[8][8][2],int g, int e) // g and e are the required systems and blocks respectively
{
backtracking(backtrackarray, l); // calling function to backtrack the array
backtracking(secondbacktrackarray,l); againcalling function to backtrack array in different array
int system = currentsystem(l, currentposition[0], currentposition[1]); //storing the current system
for (int i = 0; i < 3; i++)
{
nextmove(l, currentposition[0], currentposition[1]); //moving knight
}
if (blockshiftpossible(l, system, currentposition[0], currentposition[1])!= 1) // checks if next block shift possible
{
backimage(l, backtrackarray); getting back the stored image
for (int i = 0; i < 3; i++)
{
reversenextmove(l, currentposition[0], currentposition[1]); // moving in the opposite way
}
}
if ((systemshiftpossible(l, currentposition[0], currentposition[1])!= 1) && (g==4) && (e==4)) // checking if system shift is possible
{
backimage(l,secondbacktrackarray); // getting again image from second backtrack array
for (int i = 0; i < 3; i++)
{
reversenextmove(l, currentposition[0], currentposition[1]); // moving in opposite direction
}
if (systemshiftpossible(l, currentposition[0], currentposition[1])!= 1)
{
for (int i = 0; i < 3; i++)
{
nextmove(l, currentposition[0], currentposition[1]);
}
}
}
if ((blockshiftpossible(l, system, currentposition[0], currentposition[1])
== 1) && (g!=4))
{
blockshift(l, currentposition[0], currentposition[1]);
}
else
{
cout << "logical error"<<endl;
}
}
要查看此技术的详细信息,请查看我之前的问题 Solving knight tour with c++
如果可能的话,我如何改变它以获得n * n谜题的解决方案。