Ändern das 8-puzzle code zum drucken der Zwischenstufen zum erreichen der Lösung

Über die 8-Puzzle-Problem

//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?

InformationsquelleAutor andandandand | 2009-12-10
Schreibe einen Kommentar