ich kann dir sagen, wie ich es bei einem programm gemacht habe. das war zwar einiges an quelltext, aber es hat funktioniert.
zunächst würde ich einen record deklarieren, der für jedes feld der karte den kürzesten weg vom startpunkt dorthin speichern soll:
weg : array[1..i,1..j] of record
anzahl : integer;
feldx,feldy : array[1..anzahl];
end; //oder so ähnlich
"anzahl" ist die Anzahl der Felder, die bei diesem Weg zurückgelegt werden, "feldx" und "feldy" speichern die Koordinaten der Felder, die benutzt wurden. z.B. weg[4,5].feldx[3] ist die x-koordinate des 3. Feldes, das auf dem Weg (von 1,1) nach 4,5 benutzt wird.
dieser record sollte zuerst komplett mit 0 belegt werden.
So, nun dazu, wie das record "weg" berechnet werden kann.
Man klappert in einer for-Schleife alle Felder hintereinander ab und überprüft bei jedem Feld ("aktuellesfeld",z.B. 1,1) folgendes:
Wenn die weg["umfeld"].anzahl eines benachbarten Feldes ("umfeld") kleiner ist als die eigene (oder wenn weg["aktuellesfeld"].anzahl=0) , überträgt man den wert weg["umfeld"].anzahl + 1 auf weg["aktuellesfeld"].anzahl sowie die koordinaten:
for i := 1 to weg["umfeld"].anzahl do
weg["aktuellesfeld"].feldx[i] := weg["umfeld"].feldx[i];
dasselbe mit "feldy".
jetzt speichert man in weg["aktuellesfeld"].feldx[weg["aktuellesfeld"].anzahl] die x-koordinate von "umfeld", mit "feldy" dasselbe.
Wenn man diesen Vorgang (die for-Schleife) oft genug wiederholt, liegt im record die Information des kürzesten Wegs zu jedem beliebigen Feld der Karte.
Um die Rechenzeit zu verkürzen, kann man davor noch einen array deklarieren, der alle Felder der Karte in einer sinnvollen Weise abspeichert, also spiralenförmig vom Startpunkt nach außen gehend. Das war bei meinem programm schwer zu realisieren, da ich hexagonale Felder benutzt habe, doch mit quadratischen Feldern müsste das einfacher gehen.
Am Ende sollte in diesem array z.B. stehen (mit 1,1 als Startfeld):
felderx[2,2,1,3,3,3,2,1,4,4,4,4,3,2,1,5,5,5,5,5,4,3,2,1,6,6,6,6,6,6...]
feldery[1,2,2,1,2,3,3,3,1,2,3,4,4,4,4,1,2,3,4,5,5,5,5,5,1,2,3,4,5,6...]
Wenn in der oben beschriebenen for-Schleife diese Felder abgeklappert werden, sollte das ganze schneller gehen.
Je häufiger du die for-Schleife laufen lässt, desto genauer wird die Ermittlung des kürzesten Weges. Falls also der kürzest mögliche Weg aus 60 Feldern besteht und erkannt werden soll, muss die for-Schleife 60 mal laufen gelassen werden. Im Normalfall würde ich sagen, dass 10 mal ausreicht.
Ich hoffe, es ist verständlicher als es sich anhört...
Bin für Rückfragen offen.