Nemel jsem zadny superprogram, ale vysledky jsem i pro nejslozitejsi pripady dostal behem par sekund. Neni to slozita uloha pro toho, kdo prosel nejakymi zaklady programovani a nepusti se do toho hrubou silou.
také by mě zajímalo, jak to udělat jinak, než hrubou silou :-)
obyčejné prohledávání stavového prostoru do šířky bez jakékoliv heuristiky, které jsem použil, a které mi dávalo výsledky v dobách řádu těch milisekund (tj. nedokázal bych to sám svými smysly zaznamenat), považuji stále za hrubou sílu :-)
To ne, hruba sila je nahodne prochazeni do hloubky. Kdyz uz to je do sirky, tak je to efektivni algoritmus a kdyz se navic zahazuji uz navstivene stavy, tak je to sofistikovana heuristika. Za ni uz je pouze orakulum :-)
to mám trochu jiný názor ...
Náhodné procházení do hloubky považuju za naprosto hloupé řešení.
Procházení do šířky není efektivní, jen z hlediska své definice najde vždycky to nejlepší řešení. Za efektivní (a tedy se sofistikovanou heuristikou) bych považoval inteligentní procházení do hloubky (tj. že by se šlo rovnou k cíli). Ovšem v tomto případě naprosto netuším, jak by taková heuristika mohla vypadat... (a navíc množství stavů tady není tak veliké, aby prostá hrubá síla schovaná za procházením do šířky nestačila :-) )
Nezahazování prošlých stavů považuji za chybu implementace algoritmu...
Jo, jasne, ja si delal legraci. Ale docela me zarazilo, ze se da rict, ze hruba sila je vlastne zaroven nejspis nejlepsi reseni v tomhle pripade. Vsechno horsi uz je spatne, a nic lepsiho me nenapada.
Predposledni zadani mi trva asi 25ms po prohledani asi 3000 stavu. Ostatni co jsem zkousel byly do 10ms. Zkousel jsem to v jave na starem ntb. Takze pro takhle maly vstup se to do tech par ms da, ale umi to rust nepekne rychle pri osklivejsim zadani :-)
Tak se nestyd a posli to:) Ja to delal hloupe v .NETu tak ze jsem byl totalne liny, takze jsem si vygeneroval prvni stav a pak udelal vsechny mozne stavy, do kterych se muze dostat, ulozil do do textaku a v dalsim pruchodu sel dal (teda poprve jsem to udelal super line s rekurzi a 100MB stack nestacil, tak jsem to delal takhle:)
Predposledni trval asi minutu nebo dve a na konci bylo nekolik giga fajlu:)
Jako "vylepsovak":o) je samozrejme setrizeni vysledku z kazdeho levelu a vyhodit duplicity, pripadne vyhodit i v zavislosti na predchozich levelech .... no a taky by asi neco usetrilo to, kdybych to nehazel do souboru a pak nemusel zpetne parsovat gigovy textovy fajl na integer hodnoty:) Kdyz jsem ten gigovy setridil a vyhazel duplicity tak mi zbylo par kilo, ale ani tak nevim, jestli bych se vesel do par ms, ikdyz mozna jo:)