Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        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);
        }