Ändern das 8-puzzle code zum drucken der Zwischenstufen zum erreichen der Lösung
//Breadth First Search-Nutzung in den gemeinsamen Acht-Puzzle-Problem.
import java.util.*;
class EightPuzzle {
Queue<String> q = new LinkedList<String>(); //Use of Queue Implemented using LinkedList for Storing All the Nodes in BFS.
Map<String,Integer> map = new HashMap<String, Integer>(); //HashMap is used to ignore repeated nodes
public static void main(String args[]){
String str="087465132"; //Input the Board State as a String with 0 as the Blank Space
EightPuzzle e = new EightPuzzle(); //New Instance of the EightPuzzle
e.add(str,0); //Add the Initial State
while(e.q.peek()!=null){
e.up(e.q.peek()); //Move the blank space up and add new state to queue
e.down(e.q.peek()); //Move the blank space down
e.left(e.q.peek()); //Move left
e.right(e.q.remove()); //Move right and remove the current node from Queue
}
System.out.println("Solution doesn't exist");
}
//Add method to add the new string to the Map and Queue
void add(String str,int n){
if(!map.containsKey(str)){
map.put(str,n);
q.add(str);
}
}
/* Each of the Methods below Takes the Current State of Board as String. Then the operation to move the blank space is done if possible.
After that the new string is added to the map and queue.If it is the Goal State then the Program Terminates.
*/
void up(String str){
int a = str.indexOf("0");
if(a>2){
String s = str.substring(0,a-3)+"0"+str.substring(a-2,a)+str.charAt(a-3)+str.substring(a+1);
add(s,map.get(str)+1);
if(s.equals("123456780")) {
System.out.println("Solution Exists at Level "+map.get(s)+" of the tree");
System.exit(0);
}
}
}
void down(String str){
int a = str.indexOf("0");
if(a<6){
String s = str.substring(0,a)+str.substring(a+3,a+4)+str.substring(a+1,a+3)+"0"+str.substring(a+4);
add(s,map.get(str)+1);
if(s.equals("123456780")) {
System.out.println("Solution Exists at Level "+map.get(s)+" of the tree");
System.exit(0);
}
}
}
void left(String str){
int a = str.indexOf("0");
if(a!=0 && a!=3 && a!=6){
String s = str.substring(0,a-1)+"0"+str.charAt(a-1)+str.substring(a+1);
add(s,map.get(str)+1);
if(s.equals("123456780")) {
System.out.println("Solution Exists at Level "+map.get(s)+" of the tree");
System.exit(0);
}
}
}
void right(String str){
int a = str.indexOf("0");
if(a!=2 && a!=5 && a!=8){
String s = str.substring(0,a)+str.charAt(a+1)+"0"+str.substring(a+2);
add(s,map.get(str)+1);
if(s.equals("123456780")) {
System.out.println("Solution Exists at Level "+map.get(s)+" of the tree");
System.exit(0);
}
}
}
}
Möchte ich den code ändern, so dass es druckt die Zwischenstufen zu erreichen, die Lösung, anstatt nur zu sagen, die Ebene, auf der die Lösung erreicht wurde.
Beispiel dieses board
1 4 2
3 0 5
6 7 8
(als String 142305678)
Will ich es drucken:
1 4 2
3 0 5
6 7 8
(als String 142305678)
1 0 2
3 4 5
6 7 8
(als String 102345678)
0 1 2
3 4 5
6 7 8
(als String 012345678)
Indem Sie sich den code, ich glaube, das fortgeschrittene Streicher sind immer gespeichert, die über die add-Methode in die Warteschlange:
void add(String str,int n){
if(!map.containsKey(str)){
map.put(str,n);
q.add(str);
}
}
Ich habe keine Erfahrung in der Arbeit mit HashMap, wie würde ich Aussehen in die Zwischenzustände dort gespeichert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier, wie ich richten Sie Ihre Anfrage an Holen Sie sich die trail Verknüpfung von start zu Ziel:
stateHistory
Karte zu beziehen, die jeder Staat zu seinem Vorgänger.checkCompletion
Methode.add
Methode, um neuen und alten Bundesländern (verinnerlicht, Tiefe lookup-Methode) und zur Aufrechterhaltung derstateHistory
Karte sowie diestateDepth
Karte undagenda
Warteschlange.checkCompletion
Methode laufen diestateHistory
wieder aus dem Ziel-Zustand (einmal erreicht), um den ursprünglichen Zustand (den man mit keinen Vorgänger).Läuft der geänderte code erzeugt diese Ausgabe:
Weitere änderung zum drucken der Sequenz in aufsteigender Reihenfolge (start-zu-Ziel, anstatt rückwärts vom Ziel-zum-start) ist Links als eine übung für die Schüler.
Tatsächlich, die Lösung erscheint in der queue abgelegt. Die Karte wird nur verwendet, um zu erkennen, wiederholt Staaten.
Wenn es fertig ist, pop-jedes Element aus der Warteschlange und drucken Sie es aus.
Eine kleine Verbesserung zu Joel Neely ' s-version: bei der Initialisierung
e.stateDepth.put(null, -1);
vereinfacht die Logik in der add-Methodeint newValue = stateDepth.get(oldState) + 1;
.Müssen Sie nur fügen Sie eine Zeile code zu drucken, der Zwischenzustände.
In der Funktion hinzufügen, fügen Sie den code
Den gesamten code wird wie folgt Aussehen.
Wird die Ausgabe wie folgt Aussehen.Ausgabe
Aber es gibt auch Staaten, die nicht dazu beitragen, das Ziel zu erreichen Stand.