Die Aufnahme einer Labyrinth-Pfad-Lösung mit einem Stapel
Ich bin zu generieren, die eine Lösung für ein Labyrinth mit einer linked-list-Implementierung eines Stacks in gewisser Weise. Das Labyrinth ist Lesen in einem .txt-Datei und enthält 0 ist für Freiflächen und 1 für Wände.
<- Ziemlich sicher, dass ein exit muss in der unteren Zeile? Diese drei 0?
Den Algorithmus, den ich bin versucht zu verwenden ist:
While Not At End
If Can Go North
Go North
ElseIf Can Go East
Go East
ElseIf Can Go South
Go South
ElseIf Can Go West
Go West
EndIf
Wend
Den Weg habe ich schon versucht es beruhte auf den ++ - Operationen ausführen innerhalb einer array-index. Ich war nicht bewusst, das array-subskript-operator [ nahm Vorrang vor + + so jetzt muss ich überdenken umgehen. Bevor Sie dies tun, möchte ich sichergehen, dass diese Methode auch die Arbeit in den ersten Platz. Könnte jemand einen Blick auf meinen algo-code so weit und einige feed zurück? (Anmerkung: ich muss noch hinzufügen, in einigen code zu verfolgen, Wege zu vermeiden, irgendeine Art von Endlosschleife)
bool notSolved = true;
int path = 0;
row = 0;
col = 0;
rowStack.push(row);
colStack.push(col);
while (notSolved){
//(from perspective of person looking at maze on screen)
if (maze[row--][col] == 0){//if you can go up, go up
rowStack.push(row);
colStack.push(col);
path++;
}
else if (maze[row][col++] == 0){//else if you can go right, go right
rowStack.push(row);
colStack.push(col);
path++;
}
else if (maze[row++][col] == 0){//else if you can go down, go down
rowStack.push(row);
colStack.push(col);
path++;
}
else if (maze[row][col--] == 0){//else if you can go left, go left
rowStack.push(row);
colStack.push(col);
path++;
}
if((maze[row][col] == 0) && (row == (size - 1))){//if we reached an exit
cout << "Solution Path:" << endl;
for (int i = 0; i < path; i++){
cout << "row:" << rowStack.top() << " col:" << colStack.top() << endl;
rowStack.pop();
colStack.pop();
}
notSolved = false;
}
}
Problem mit dem ausführen von [ vor ++:
Jede Hilfe dankbar, vielen Dank!
- Rekursion ist dein Freund auf diese ein.
- Sie haben eine spezielle Frage?
- Ich glaube nicht, dass Algorithmus ist besonders gut, zum Beispiel, wenn Sie laufen in der rechten Wand, während er in einer horizontalen tunnel, Sie hüpfen hin und her, von rechts nach Links für immer.
- Suche zuerst der Breite besser funktioniert, auf Labyrinthe, so dass in diesem Fall eine Warteschlange könnte ein besserer "Freund" als Rekursion. Auch wenn Sie sich entscheiden, zu gehen, Tiefe-zuerst, könnten Sie besser dran mit einem stack und einer "while" - Schleife statt der Rekursion. Da der Suchraum wächst als N^2, die Gefahr, dass die Stapel in einen rekursiven Aufruf ganz real wird.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein Algorithmus funktioniert nicht in einigen Labyrinthe, die kreisförmigen Pfade: wenn man einmal in einem dieser, werden Sie sich im Kreis zu drehen. Um dies zu beheben, benötigen Sie ein boolean-array besucht[R][C][DIR], wobei DIR eine Zahl von null bis drei vertreten eine Richtung. Beim verlassen der Zelle [r][c] in Richtung [d], setzen Sie besuchte[r][c][d] auf true. Das nächste mal Sie besuchen die gleiche Zelle, sehen Sie, wenn Sie es verlassen in die gleiche Richtung vor; wenn Sie getan haben, überspringen Sie die Richtung, und gehen Sie zum nächsten auf der ganzen Linie.
else{//if stuck rowStack.pop(); colStack.pop(); row = rowStack.top(); col = colStack.top(); }
Aber alles, was jetzt zu tun scheint, ist pop-jeder vorherigen Schritt Weg von der Oberseite des Stapels, bis es leer istelse{ row = rowStack.top(); col = colStack.top(); rowStack.pop(); colStack.pop(); }
++
und--
tatsächlich ändern Sie die row /col-Variablen. Ich denke, Sie wollen zu tunmaze[row - 1][col] == 0
und dann, nachdem Sie verschoben haben, aktualisieren Sie die Zeile position.