Това е реална ситуация, а не математическа задача, което променя всичко - математиката винаги търси единствения оптимум, докато в реалността едно добро решение може да се окаже за предпочитане пред 10 часа сметки.
Първия въпрос на който трябва да си отговориш е точно какво решение искаш. Така като гледам идеалното решение ще иска пълната рекурсия, каквато казваш си направил, ама на мен лично не ми иде на акъла как си успял :) - всички възможности на последователност на вземане са лесни, но опитай да извъртиш и всички възможности за местене с начална и крайна клетка.
Доколкото усещам отговора е "добро решение за кратко време".
Втория въпрос е как да сравниш двете изисквания - брой на премествания и изминато разстояние. Трябва ти нещо като "едно преместване е равно на разстоянието на което се мести + 2 или разстоянието по 2 + 10 ..."
Трето - много добре си помисли дали не пропускаш данни от сорта на това как се прави разбъркването и за чий са разбъркани. Може да се окаже, че има възможност част от това действие да бъде обърнато и да не караш едно по едно, а да махаш по няколко числа.
Четвърто - постави под въпрос условията, след като не е математическа задачата можеш да си го позволиш. Няма ли начин нещата да се опростят? Няма ли начин тия числа да се сортират като идват? Защо реално се стига до такава идиотска постановка?
Следващо по ред - времето с което разполагаш. За колко време машината извършва едно действие? Варианта да започнеш да изчисляваш и да си го докарал до под крушата с кофти решение, когато тя започне не е провал, можеш да подобряваш решението си в процес на работа на машината на принципа на който работят шахматните алгоритми - дай им повече време и ще ти дадат по-добро решение.
Имаш го на нещо като игра - идеално - играй я! Позанимавай се с нея няколко часа и ще откриеш патерни на действие, за едно пускане мога да ти дам някои идеи:
- вземането на най-горното не е далавера, защото намалява възможностите ти и увеличава шанса да ти се наложи да местиш
- имаш поредицата, когато местиш можеш да изграждаш колони които да бъдат вземани под ред
- при избор кое да вземеш можеш да оценяваш тези които се отварят след него
-- отварянето на рядко число е на далавера
-- отварянето на число което е следващо в списъка е на още по-голяма далавера
-- отварянето на число което за момента не е отворено също е добре
...
Мисля, че можеш да сложиш още доста подобни критерии и да ги класираш. После можеш да напишеш тестове, които да ти дадат статистика и да си подобриш класацията.
Айде, че много стана пък и аз си имам работа :)
----------------------------------------
Здрав дух, в здрава бутилка!
|