Я пытался решить проблему с рыцарским туром, и я только что сделал это. Теперь я хочу улучшить его. Он принимает начальное значение и затем выводит пошаговые инструкции для перемещения (в выводе командной строки).
Теперь техника, которую я использовал, состоит в том, что сначала я разделил доску на 4 блока в соответствии с решением, приведенным в видео.
(здесь www.youtube.com% 2Fwatch% 3Fv% 3DdWM5pKYZCHw&б = 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;
}
}
Чтобы увидеть детали этой техники, проверьте мой предыдущий вопрос
Решающий рыцарский тур с с ++
Также, как я могу изменить это, чтобы получить решения для n * n загадок, если это возможно.
Задача ещё не решена.
Других решений пока нет …