我试图解决骑士巡回赛的问题,而我刚刚做到了。现在我想改进它。它采用起始值,然后输出逐步指令移动(在命令行输出中)。
现在我使用的技术是,首先我根据视频中给出的解决方案将电路板分成 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 谜题的解决方案。