Альтернатива возврату назад и ускорению программы

Я пытался решить проблему с рыцарским туром, и я только что сделал это. Теперь я хочу улучшить его. Он принимает начальное значение и затем выводит пошаговые инструкции для перемещения (в выводе командной строки).

Теперь техника, которую я использовал, состоит в том, что сначала я разделил доску на 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 загадок, если это возможно.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector