2010-11-21 21 views
0

Das Problem ist wie folgt: Ein Wanderer beginnt auf den Gitterkoordinaten (x, y) und will die Koordinaten (0,0) erreichen. Von jedem Gitterpunkt aus kann der Wanderer 8 Schritte nach Norden ODER 3 Schritte nach Süden ODER 5 Schritte nach Osten ODER 6 Schritte nach Westen (8N/3S/5E/6W) gehen.BFS-Algorithmus - kürzester Weg auf Gitter mit eingeschränkten Schritten

Wie kann ich die kürzeste Route von (X, Y) nach (0,0) mit der Breitensuche finden?

Clarifications:

  • unbegrenzt grid
  • Negative Koordinaten
  • Eine Warteschlange sind erlaubt (verknüpfte Liste oder eines Arrays) sind
  • keine Hindernisse vorhanden
+2

Es tut mir leid, aber ich habe nichts gefunden, um in Ihrer Frage zu erklären ... –

+0

Alle Hindernisse im Netz vorhanden? Wie groß sind die Abmessungen des Gitters? – bjskishore123

+0

warum denken Sie nicht (8N/3S/5E/6W). Ich meine warum nur einmal nur Nord/Süd/Ost/West schiebend. Wäre das nicht die Antwort in BFS ändern? Bitte erläutern Sie ... –

Antwort

-2

Ich werde weitermachen und meine eigene Frage für die Zukunft zu beantworten.

Psuedocode:

while (true) { 
    if (destination reached) 
     break; 
    addToQueue(go north); 
    addToQueue(go south); 
    addToQueue(go east); 
    addToQueue(go west); 
    getNextFromQueue; 
} 

Es sollte auch, dass die Ausführungszeit wächst sehr für diese Anwendung festgestellt werden, sehr schnell, so testen Sie es aus mit kleinen Werten koordinieren. Zum Beispiel ergeben die Koordinaten (1,1) 7 Ebenen von Breite und erfordern 16384 Iterationen.

+1

Sind Sie sicher, dass das funktioniert? Wenn Sie der Warteschlange N, S, E, W immer in dieser Reihenfolge hinzufügen, haben Sie eine Verzerrung. Nach jeweils vier Schritten landest du 5 Einheiten mehr nördlich als du begonnen hast und 1 Einheit mehr westlich. Wenn Ihr Startpunkt nördlich und westlich von (0,0) liegt, werden Sie sich davon entfernen. – miked

2

Der Algorithmus verwendet werden, Dieses Problem wäre:

Für jede Achse Schritt in diese Richtung, bis Ihre Position auf der anderen Achse ist 0.

Pseudocode:

while (x!=0) { 
    if (x>0) x-=6; 
    else x+=5; 
} 
while (y!=0) { 
    if (y>0) y-=8; 
    else y+=3; 
} 

Aber ich verstehe nicht, warum Sie nach einer Route suchen müssen - es ist nicht das ist, kompliziert.

+0

Ja, und keine Warteschlange benötigt. Dummes Hausaufgabenproblem. – miked

1

Wie "thejh" bemerkte, gibt es keine Notwendigkeit für eine Suche, aber Ihre Aufgabe erfordert eine.

Ein sinnvoller Ansatz ist

  1. analysieren. Ist alles möglich für beliebige (x, y) Startposition? Wenn Sie die erlaubten Bewegungen überprüfen, sehen Sie, dass sie kombiniert werden können, um horizontale Ein-Schritt-Bewegungen und vertikale Ein-Schritt-Züge zu erzielen. Die Antwort darauf ist ja (Ihr Hand-in liefert die Details dazu).

  2. Herauszufinden, was "Breitensuche" ist. Wikipedia ist dein Freund (obwohl, wenn du Zugang zu einer Universitätsbibliothek hast, empfehle ich wirklich Patrick Henry Winstons altes Artifical Intelligence, es sind wirklich gute, sehr klare Erklärungen). Probieren Sie es mit einem einfacheren Problem aus.

  3. Führen Sie das Problem in etwa auf die gleiche Weise aus. Fragen Sie hier, wenn Sie auf ein technisches C++ - Problem stoßen.

Beifall & hth.,

+0

In Bezug auf Punkt 2: Das ist ziemlich genau, warum ich gepostet :) Ich habe nach Erklärungen und Codebeispielen für BFS-Suchen gesucht, aber wenn ich nicht finden konnte, habe ich dieses Problem geschrieben, weil ich verstand, was es verlangte und wie man es mit DFS (Tiefensuche), aber nicht mit BFS implementiert und löst. – Gorkamorka

1

Hier ist meine Antwort (wirklich basiert weg Antwort von thejh ist), die eine Warteschlange verwendet:

//set x to start position 
//set y to start position 
do { 
    if (x<0) Queue.Push(8N); 
    if (x>0) Queue.Push(3S); 
    if (y<0) Queue.Push(5E); 
    if (y>0) Queue.Push(6W); 
    while (!Queue.Empty()) 
    { 
    Move(Queue.Pop()); 
    } 
} while (x && y); 

Es ist gewunden, sondern folgt den Anweisungen.

Verwandte Themen