Newer
Older
maze / src / main / net / curtlewis / maze / distance / Distances.java
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; }
}