package Assignments.A1.solving_algorithms; import Assignments.A1.models.Board; import Assignments.A1.models.BoardNode; import Assignments.A1.models.Move; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.PriorityQueue; public class AStar { private final Board solved = new Board(); private final HashSet visited = new HashSet<>(); public Board traverse(Board root) { PriorityQueue boards = new PriorityQueue<>(new UCSPriority()); boards.add(new BoardNode(root, null)); BoardNode node = null; Board current = new Board(root); while (!current.equals(solved)) { node = boards.poll(); current = node.board; if (visited.contains(node.board)) { continue; } visited.add(node.board); List children = node.board.getMoves(); for (Move move : children) { Board child = new Board(node.board); child.swap(move); boards.add(new BoardNode(child, node)); } } return node.board; } } class AStarPriority implements Comparator { @Override public int compare(BoardNode o1, BoardNode o2) { return Integer.compare(o2.cost, o1.cost); } }