![]() |
AW: Stack-Overflow abfangen
Delphi-Quellcode:
Da hast du einen Denkfehler.
Bedenkt aber, daß man auch etwas mehr Speicher benötigt, wenn man sich den Weg merkt, da dieses für jede Rekusrionsebene einzeln gepeichert (kopiert und erweitert) werden muß.
Man muss sich maximal so viel Felder merken wie es insgesamt gibt (nicht alle Kombinationen). Zudem kann man auch noch mit Bits arbeiten (Pro Feld ein Bit) und schon benötigt man gar nicht mehr sooo viel Speicher. |
AW: Stack-Overflow abfangen
Echt? Ich würde der Matrix ein weiteres Feld gönnen (Visited:Boolean).
Betrete ich das Feld, prüfe ich, ob Visited=True, wenn ja, beende ich die Routine, ich war ja schon mal da. Ansonsten setze ich Visited=True, suche nach weiteren Wegen und nehme aber nur die Nachbarfelder mit ins Boot, die ich noch nicht besucht habe. Dann rufe ich mich selbst mit allen Nachbarkandidaten rekursiv auf. Bevor ich die Routine verlasse, setze ich Visited wieder auf False:
Delphi-Quellcode:
Procedure TMatrix.Visit (Source : TPoint; Path : TPath);
Begin If Source = FinalDestination then Success(Path) Else If not Self.Visited[Source] Then begin Self.Visited[Source] := True; Foreach Neighbor in Source.Neighbors do If not Self.Visited[Neighbor] Then Visit(Neighbor, Path+Neighbor) Self.Visited[Source] := False; End End; |
AW: Stack-Overflow abfangen
OK, einen Denkfehler hab ich schon, wenn man die betretenen Felder wieder frei gibt, sobald mein wieder eine Ebene zurück geht, dann stimmt es. :oops:
|
AW: Stack-Overflow abfangen
Oder einfach gleich A* nehmen, schließlich will er ja einen Weg von A->B finden.
|
AW: Stack-Overflow abfangen
Das ist mir auch schon die ganze zeit im Kopf rumgeschwirrt. Hie rgibt es ein Demo und ein Tutorial:
![]() |
AW: Stack-Overflow abfangen
Zitat:
Ein korrekter Algorithmus wird bei diesen kleinen Feldern nie zu einem Stacküberlauf führen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz