public override bool Equals(object obj) { if (obj == null || GetType() != obj.GetType()) { return(false); } MazeState mazeState = (MazeState)obj; return((Position == mazeState.Position) && (Distance == mazeState.Distance)); }
public static void Main(string[] args) { string source = File.ReadAllText(@"..\..\input.txt"); source = source.Remove(source.Length - 1); List <string> instructions = source.Split('\n').ToList(); char[,] maze = CreateMaze(instructions); List <char> locations = new List <char> { '0', '1', '2', '3', '4', '5', '6', '7' }; List <Point> points = locations.Select(l => FindPoint(maze, l)).ToList(); List <List <char> > locationPermutations = Permutations.GeneratePermutations(locations); locationPermutations = locationPermutations.Where(lp => lp[0] == '0').ToList(); Dictionary <string, int> storedDistances = new Dictionary <string, int>(); for (int i = 0; i < points.Count; i++) { for (int j = 0; j < points.Count; j++) { MazeState state = FindShortestPath(maze, points[i], points[j]); storedDistances.Add(i + "" + j, state.Distance); } } List <PathDistance> pathDistances = locationPermutations.Select(lp => new PathDistance { Locations = lp, Distance = GetTotalDistance(storedDistances, lp) }).ToList(); int partOne = pathDistances.Min().Distance; foreach (List <char> locationPermutation in locationPermutations) { locationPermutation.Add('0'); } pathDistances = locationPermutations.Select(lp => new PathDistance { Locations = lp, Distance = GetTotalDistance(storedDistances, lp) }).ToList(); int partTwo = pathDistances.Min().Distance; Console.WriteLine("Part one = {0}", partOne); Console.WriteLine("Part two = {0}", partTwo); Console.ReadLine(); }
private static MazeState FindShortestPath(char[,] maze, Point start, Point target) { Queue <MazeState> statesQueue = new Queue <MazeState>(new[] { new MazeState(start, 0) }); MazeState finishState = null; while (statesQueue.Count > 0) { MazeState currentState = statesQueue.Dequeue(); if (currentState.Position == target) { finishState = finishState ?? currentState; } else { HashSet <MazeState> possibleMoves = new HashSet <MazeState> { new MazeState(currentState.Position.X + 1, currentState.Position.Y, currentState.Distance + 1), new MazeState(currentState.Position.X - 1, currentState.Position.Y, currentState.Distance + 1), new MazeState(currentState.Position.X, currentState.Position.Y + 1, currentState.Distance + 1), new MazeState(currentState.Position.X, currentState.Position.Y - 1, currentState.Distance + 1) }; if (finishState != null) { possibleMoves = new HashSet <MazeState>(possibleMoves.Where(move => move.Distance < finishState.Distance)); } foreach (MazeState newState in possibleMoves) { if (IsOpenSpace(maze, newState.Position.X, newState.Position.Y) && !statesQueue.Contains(newState)) { statesQueue.Enqueue(newState); } } } } return(finishState); }