私はナイツ ツアーの問題を解決しようとしていましたが、ちょうどそれを作ったところです。今、私はそれを改善したいと思います。開始値を取り、移動するためのステップバイステップの指示を出力します(コマンドライン出力で)。
今私が使用したテクニックは、最初にビデオで与えられた解決策に従ってボードを4つのブロックに分割し(ここではwww.youtube.com%2Fwatch%3Fv%3DdWM5pKYZCHw&b=28)、ボード全体を4つに分割しました。ボックスのシステム。
解決策では、速度を大幅に低下させる2つの異なる可能性を決定するために、多くのバックトラックを行う必要があります. また、技術を改善するためのその他の提案。ここにコードの一部があります(ボード全体で騎士を動かす関数)
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;
}
}
このテクニックの詳細を確認するには、私の以前の質問 を確認してください。
また、可能であれば、n*n パズルの解決策を得るためにそれを変更する方法も教えてください。