private IEnumerable <SeatNeighborhood> GetImmediateSeatNeighborhoods(SeatsMap sm) { List <SeatNeighborhood> neighborhoods = new List <SeatNeighborhood>(); foreach (Tuple <int, int> seat in sm.Seats) { // Unrolling the cases for all eight directions. SeatNeighborhood sn = new SeatNeighborhood(seat); Tuple <int, int> candidate = Tuple.Create(seat.Item1 - 1, seat.Item2 - 1); if (sm.ContainsKey(candidate)) { sn.SetNeighbor(Direction.TopLeft, candidate); } candidate = Tuple.Create(seat.Item1 - 1, seat.Item2); if (sm.ContainsKey(candidate)) { sn.SetNeighbor(Direction.Top, candidate); } candidate = Tuple.Create(seat.Item1 - 1, seat.Item2 + 1); if (sm.ContainsKey(candidate)) { sn.SetNeighbor(Direction.TopRight, candidate); } candidate = Tuple.Create(seat.Item1, seat.Item2 + 1); if (sm.ContainsKey(candidate)) { sn.SetNeighbor(Direction.Right, candidate); } candidate = Tuple.Create(seat.Item1 + 1, seat.Item2 + 1); if (sm.ContainsKey(candidate)) { sn.SetNeighbor(Direction.BottomRight, candidate); } candidate = Tuple.Create(seat.Item1 + 1, seat.Item2); if (sm.ContainsKey(candidate)) { sn.SetNeighbor(Direction.Bottom, candidate); } candidate = Tuple.Create(seat.Item1 + 1, seat.Item2 - 1); if (sm.ContainsKey(candidate)) { sn.SetNeighbor(Direction.BottomLeft, candidate); } candidate = Tuple.Create(seat.Item1, seat.Item2 - 1); if (sm.ContainsKey(candidate)) { sn.SetNeighbor(Direction.Left, candidate); } yield return(sn); } }
private IEnumerable <SeatNeighborhood> GetClosestSeatNeighborhoods(SeatsMap sm) { List <SeatNeighborhood> neighborhoods = new List <SeatNeighborhood>(); foreach (Tuple <int, int> seat in sm.Seats) { SeatNeighborhood sn = new SeatNeighborhood(seat); foreach (SeatNeighborhood neighborhood in neighborhoods) { if (TryGetDirection(neighborhood.Seat, seat, out var direction)) { Direction opposite = GetOppositeDirection(direction); Tuple <int, int> neighbor = neighborhood.GetNeighbor(direction); if (neighbor is Tuple <int, int> ) { int neighborDist = GetManhattanDistance(neighbor, neighborhood.Seat); int seatDist = GetManhattanDistance(seat, neighborhood.Seat); if (seatDist < neighborDist) { neighborhood.SetNeighbor(direction, seat); sn.SetNeighbor(opposite, neighborhood.Seat); } } else { neighborhood.SetNeighbor(direction, seat); sn.SetNeighbor(opposite, neighborhood.Seat); } } } neighborhoods.Add(sn); } return(neighborhoods); }