private void FloodFillMinDistancesKing(Point point, PieceGrid pieceGrid, PointSquareArray <double?> result) { ISet <Point> visited = new HashSet <Point>(); Queue <(Point, double)> toVisit = new Queue <(Point, double)>(); foreach (Point p in point.GetAdjacentPoints().Where(adj => !pieceGrid.IsOutOfBounds(adj) && !pieceGrid.PointPieces[adj].Impassible)) { toVisit.Enqueue((p, 1)); } while (toVisit.Any()) { (Point, double)p = toVisit.Dequeue(); if (visited.Contains(p.Item1)) { continue; } if (result[p.Item1].HasValue) { result[p.Item1] = Math.Min(p.Item2, result[p.Item1].Value); } else { result.Add(p.Item1, p.Item2); } if (SpecificKingDistances[point] == null) { SpecificKingDistances.Add(point, new PointSquareArray <double>(pieceGrid.Size)); } SpecificKingDistances[point].Add(p.Item1, p.Item2); visited.Add(p.Item1); foreach (Point pNext in p.Item1.GetAdjacentPoints() .Where(adj => !pieceGrid.IsOutOfBounds(adj) && !pieceGrid.PointPieces[adj].Impassible && !visited.Contains(adj))) { toVisit.Enqueue((pNext, p.Item2 + 1)); } } }