Tentokrát jsem to asi s obtížností hlavolamu přehnal. Nakonec i mě se jej podařilo rozlousknout jen díky tomu, že prostě nechci nechávat nevyřešené problémy a pořád jsem zkoušel a přemýšlel, až se mi to podařilo.
Popíšu Vám úvahu, kterou jsem nakonec dospěl ke správnému algoritmu.
Pokud bych chtěl zkoumat všechny cesty, výsledku se nikdy nedoberu, protože je jich nekonečně mnoho. Můžu ale sledovat všechna čísla v matici a zkoumat nejkratší možnou cestu k němu. Je nutné směry nějak označit a protože s čísly se pracuje nejsnáze, rozhodl jsem se je očíslovat. Tak směr nahoru jsem označil jako 1, vpravo nahoru jako 2 atd. až směr vlevo nahoru jako 8. Pokud jsem někam dospěl tak, že jsem šel nejdříve nahoru a potom doprava, označil jsem tuto cestu jako "13". Toto označení mě ale omezuje pouze na 10 číslic, neboť potom dochází k zaokrouhlování. Jak se později ukázalo, nejdelší cesty (a zrovna ty správné) měly 9 skoků, takže to nakonec stačilo a nemusel jsem se uchylovat ke komplikovanějšímu používání řetězců. Myslím, že další popis uvedu přímo u čísel řádků:
10 - 130 tisk hlavičky a čekání na klávesu START
140 - 250 načtení souboru HLAV31.DAT jako čísel do pole A(23,23) - pokud je načten znak "X" (mimo obrazec), je nahrazen "-12" - a vynulování pole cest B(23,23)
260 - 370 schématické zobrazení bludiště na monitoru. V průběhu výpočtu se budou tečky reprezentující čísla nahrazovat "délkou cesty".
380 - 550 vlastní výpočet:
420 vynulování času
430 nastavení aktuálního počtu zkoumání ZZ (zatím 0)
440,450 cykly definující souřadnice (projíždí se postupně celá matice)
460 provede se podprogram hvezda (který zkoumá všech 8 možných následujících odskoků, vysvětlen dále), když ještě nebyl vůbec proveden a narazilo se na výchozí prostřední člen (vždy nulová cesta). Inicializační zkoumání.
470 narazilo se na pozici, která má kladnou a nenulovou cestu, tedy bude proveden podprogram hvezda a započítá se do proměnné ZZ. Záporná cesta znamená, že podprogram byl již volán v minulém průchodu a nemůže nic změnit - viz dále.
480,490 konec průchodu maticí.
530 během průchodu maticí se změnila alespoň jedna cesta, nutný další průchod.
540,550 nic se nezměnilo, konec.
600 - 790 podprogram hvezda:
610 cyklus zkoumající všech 8 směrů dalšího skoku.
620 zjištění o kolik se bude skákat, jaká je dosavadní cesta k dané pozici a nastavení pomocných aktuálních souřadnic.
630 cyklus postupně zkoumající skok (po jedné) určitým směrem.
640 podprogram smer. Úprava souřadnic X a Y - skok o jednotku daným směrem.
650 zjištění, kam se skočilo:
660 Pokud se skočilo na 0 a zároveň ještě nebyl skok dokončen, došlo k chybě a zkoumá se další směr.
680 nula je posledním prvkem skoku - úspěch !!
690 zvláštní případ. Skočilo se na výchozí pozici.
700 Skočilo se na prvek s nulovou cestou: první přístup k tomuto prvku. Nastaví se na něj cesta do proměnné CES.
710 skočilo se na prvek, který byl již "objeven" jinou cestou. Znaménko cesty (viz dále) bylo uloženo do proměnné ZN.
720 nová cesta je kratší, nahradí původní.
730 cesta nebyla změněna, je obnoveno původní znaménko cesty.
740 cesta se uloží do B(I,J) a na monitor se do příslušné pozice vypíše její délka.
750 Pokud byla na ř. 680 cesta vyhodnocena jako správná, je vypsána na obrazovku.
760 konec cyklu definice směrů.
770 původní kladná cesta "zdrojového" prvku (prvku, který vyvolal podprogram hvezda) se změní na zápornou, zafixuje se. Při případném dalším průchodu již tento podprogram nevyvolá.
790,860 procedura upravující souřadnice X, Y - viz ř. 640
870,920 vlastní výtisk správné cesty z ř. 750
Tento program tedy postupně zjistí nejkratší možné přístupy ke všem prvkům a uloží je do pole B(23,23).