2016-09-28 8 views
0

Ich habe zwei Punkte A und B. Ich möchte den kürzesten Weg von A nach B finden, aber es gibt N (bis zu 200) Rechtecke und der Pfad kann keines dieser Rechtecke schneiden . Pfad und Rechtecke können sich nur an den Ecken der Rechtecke und an den Seiten des Rechtecks ​​schneiden. Wie lang ist der kürzeste Weg? Rechtecke können sich nicht schneiden. Sie können Punkt oder Seite teilen. Wenn also zwei von ihnen eine Seite teilen, können Sie zwischen ihnen wechseln.Kürzester Pfad zwischen zwei Punkten im Koordinatensystem

+2

Denken Sie daran, das Problem als ein Graphproblem darzustellen und den Dijsktra-Algorithmus zu verwenden. –

+0

meinst du, dass der Pfad diagonal sein kann, wenn sich keine Rechtecke auf dem Pfad befinden? Wie groß sind die Rechtecke? Fixe oder Variable? Um einen Algorithmus zu erhalten, ist es besser, ein Format für die ursprünglichen Daten anzugeben. –

+0

Cross-posted: http://math.stackexchange.com/q/1944808/14578, http://stackoverflow.com/q/39744007/781723. Bitte [schreibe nicht dieselbe Frage auf mehreren Seiten] (http://meta.stackexchange.com/q/64068). Jede Gemeinschaft sollte eine ehrliche Antwort erhalten, ohne dass jemand Zeit verschwendet. P.S. In welchem ​​Kontext bist du dem begegnet? Ist das eine Programmierwettbewerbsfrage? –

Antwort

2

Normalerweise ist der beste Algorithmus für diese Art von Problemen A* mit einer einfachen Heuristik wie Manhattan Distance. Aber zuerst solltest du die illegalen Punkte finden. Illegale Punkte sind diejenigen, die Sie nicht in dieses Problem eingeben können. Die Punkte innerhalb eines Rechtecks ​​sind illegal (Punkte, die sich an den Seiten der Rechtecke befinden, sind legal, da Sie sie passieren können). Nachdem Sie diese Punkte gefunden haben, implementieren Sie einfach einen A * -Algorithmus, um den kürzesten Pfad zwischen A und B zu finden.

Beachten Sie, dass, da es kein Kantengewicht in diesem Problem gibt, Sie einfach ein BFS ausführen können, um den kürzesten Pfad zu finden, aber es wird nicht so schnell wie A * sein.

Wenn Ihr Suchbereich sehr groß ist und Sie mit A * nicht genügend Speicherplatz haben, sollten Sie die Verwendung von IDA* in Erwägung ziehen, die zwar weniger Arbeitsspeicher beansprucht, aber Knoten mehr als einmal untersucht.

Verwandte Themen