package net.curtlewis.maze.distance; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import net.curtlewis.maze.grid.Cell; public class Distances { private Cell root; private Map<Cell, Integer> cells; private Cell cellFarthestFromRoot; private int maxDistance; public Distances(Cell root) { this.root = root; cells = new HashMap<>(); cells.put(root, 0); } public void setDistanceTo(Cell cell, int dist) { cells.put(cell, dist); } public Set<Cell> getCells() { return cells.keySet(); } public int getDistance(Cell cell) { return cells.containsKey(cell) ? cells.get(cell) : 0; } public Distances pathTo(Cell goal) { Cell current = goal; Distances breadcrumbs = new Distances(root); if (cells.containsKey(current)) { breadcrumbs.setDistanceTo(current, cells.get(current)); } else { breadcrumbs.setDistanceTo(current, 0); } while (current != root) { for(var i = 0; i < current.getLinks().size(); i++) { Cell neighbor = current.getLinks().get(i); if (cells.containsKey(neighbor) && cells.get(neighbor) < cells.get(current)) { breadcrumbs.setDistanceTo(neighbor, cells.get(neighbor)); current = neighbor; break; } } } return breadcrumbs; } public Cell generateMaximumDistance() { maxDistance = 0; cellFarthestFromRoot = root; List<Cell> cellList = new ArrayList<Cell>(cells.keySet()); for(int i = 0; i < cellList.size(); i++) { int cellDistFromRoot = cells.get(cellList.get(i)); if (cellDistFromRoot > maxDistance) { cellFarthestFromRoot = cellList.get(i); maxDistance = cellDistFromRoot; } } return cellFarthestFromRoot; } public int getMaximumDistance() { return maxDistance; } public Cell getCellFarthestFromRoot() { return cellFarthestFromRoot; } }