Ich suche einen Algorithmus, der in einem Rennspiel verwendet werden soll, an dem ich arbeite. Die Karte/Level/Strecke wird zufällig generiert, also muss ich zwei Orte finden, Start und Ziel, die den größten Teil der Karte ausnutzen.
- Der Algorithmus soll in einem zweidimensionalen Raum arbeiten
- Von jedem Punkt aus kann man sich nur in vier Richtungen zum nächsten Punkt bewegen: nach oben, unten, links, rechts
- Punkte können nur entweder blockiert oder nicht blockiert sein, nur nicht blockierte Punkte können durchfahren werden
Was die Berechnung der Entfernung betrifft, so sollte es sich nicht um den "Vogelpfad" handeln, um ein besseres Wort zu finden. Der Weg zwischen A und B sollte länger sein, wenn sich eine Wand (oder ein anderes Hindernis) zwischen ihnen befindet.
Ich weiß nicht, wo ich anfangen soll, Kommentare sind sehr willkommen und Lösungsvorschläge werden in Pseudocode bevorzugt.
Edit : Richtig. Nach der Durchsicht von gs' Code Ich habe es noch einmal probiert. Anstelle von Python habe ich es diesmal in C++ geschrieben. Aber selbst nach der Lektüre von Dijkstras Algorithmus die Hochwasserdeponie y Hosam Alys Lösung kann ich keinen entscheidenden Unterschied erkennen. Mein Code funktioniert immer noch, aber nicht so schnell, wie Sie Ihren zum Laufen zu bringen scheinen. Der vollständige Quelltext ist auf Nudeln . Die einzige interessante Zeile ist (so vermute ich) die Dijkstra-Variante selbst in den Zeilen 78-118.
Aber Geschwindigkeit ist hier nicht das Hauptthema. Ich wäre wirklich dankbar, wenn jemand so freundlich wäre, mich auf die Unterschiede in den Algorithmen hinzuweisen.
- Besteht bei Hosam Alys Algorithmus der einzige Unterschied darin, dass er von den Rändern aus scannt und nicht von jedem Knoten aus?
- In Dijkstras kann man die zurückgelegte Strecke verfolgen und überschreiben, in floodfill nicht, aber das war's dann auch schon?
0 Stimmen
Wie sieht Ihre Karte/Ebene/Strecke aus? Ist sie zum Beispiel rechteckig? Kann sie in gleich große Quadrate unterteilt werden?
0 Stimmen
Ja. Jeder Punkt/jede Fliese auf der Ebene ist ein Quadrat, dessen mögliche Wege in alle vier Richtungen offen sind, vorausgesetzt, der benachbarte Punkt/die benachbarte Fliese ist nicht blockiert.
0 Stimmen
Wie groß kann die Karte sein? Wie viele Punkte maximal?
0 Stimmen
Sie wird nicht groß sein. Aber theoretisch gibt es keine Grenzen. 150-200 Punkte auf beiden Achsen würden in meinen Anwendungen als "groß" gelten.
0 Stimmen
Wie schnell muss es denn sein? Ich schätze, alles innerhalb von O(n^3) ist in Ordnung, oder?
0 Stimmen
Geschwindigkeit ist nicht wirklich ein Thema, die einzigen Grenzen, die ich setzen würde, wären rein zum Zweck der Ausbildung.
0 Stimmen
Funktioniert Ihre Implementierung jetzt?
0 Stimmen
Ich habe vor einiger Zeit eine ganz ähnliche Frage gestellt: stackoverflow.com/questions/169814/