All Downloads are FREE. Search and download functionalities are using the official Maven repository.

learn.week4.Solver Maven / Gradle / Ivy

The newest version!
package com.mazhangjing.algorithm.learn.week4;

import edu.princeton.cs.algs4.MinPQ;
import edu.princeton.cs.algs4.Stack;

public class Solver {
    private SearchNode currentNode;

    private static class SearchNode implements Comparable {
        final Board board;
        final SearchNode preNode;
        final int moves;
        final int priority;

        public SearchNode(Board board, SearchNode pNode) {
            this.board = board;
            this.preNode = pNode;
            if (preNode == null) moves = 0;
            else moves = preNode.moves + 1;
            priority = board.manhattan() + moves;
        }

        public int compareTo(SearchNode otherNode) {
            return Integer.compare(this.priority,otherNode.priority);
        }
    }

    public Solver(Board initial) {
        if (initial == null)
            throw new IllegalArgumentException("The initial Board is null");

        currentNode = new SearchNode(initial, null);
        MinPQ minInitialPQ = new MinPQ<>();
        minInitialPQ.insert(currentNode);

        SearchNode currentTwinNode = new SearchNode(initial.twin(), null);
        MinPQ minTwinNode = new MinPQ<>();
        minTwinNode.insert(currentTwinNode);

        boolean find = false;
        while (!find) {
            currentNode = minInitialPQ.delMin();
            if (currentNode.board.isGoal()) find = true;
            else putNeighborsBoardToPQ(currentNode, minInitialPQ);

            currentTwinNode = minTwinNode.delMin();
            if (currentTwinNode.board.isGoal()) find = true;
            else putNeighborsBoardToPQ(currentTwinNode, minTwinNode);
        }
    }

    private void putNeighborsBoardToPQ(SearchNode node, MinPQ pq) {
        node.board.neighbors().forEach((neighborBoard) -> {
            if (node.preNode == null || !neighborBoard.equals(node.preNode.board))
                pq.insert(new SearchNode(neighborBoard, node));
        });
    }

    public boolean isSolvable() { return currentNode.board.isGoal(); }

    public int moves() {
        if (isSolvable()) return currentNode.moves;
        else return -1;
    }

    public Iterable solution() {
        if (!isSolvable()) return null;
        else {
            Stack stackBoard = new Stack<>();
            SearchNode nowNode = currentNode;
            while (nowNode != null) {
                stackBoard.push(nowNode.board);
                nowNode = nowNode.preNode;
            }
            return stackBoard;
        }
    }

    public static void main(String[] args) {
        int[][] blocks = new int[3][3];

        blocks[0][0] = 8;
        blocks[0][1] = 1;
        blocks[0][2] = 3;

        blocks[1][0] = 4;
        blocks[1][1] = 0;
        blocks[1][2] = 2;

        blocks[2][0] = 7;
        blocks[2][1] = 6;
        blocks[2][2] = 5;
        Board board = new Board(blocks);

        Solver solver = new Solver(board);
        System.out.println(solver.currentNode.preNode == null);
        System.out.println(solver.currentNode.preNode);
        if (!solver.isSolvable()) {
            System.out.println("this board is can't resolve");
        }

        Iterable bIterable = solver.solution();
        System.out.println(bIterable.toString());

        for (Board it : bIterable) {
            System.out.println(it.toString());
        }

    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy