private int FinDistanceToExit() { var start = _start; var exit = _exit; var roomToVisit = _map.Values.ToList(); var distances = new Dictionary <DupdobRoom, int>(); foreach (var room in roomToVisit) { distances[room] = int.MaxValue; } distances[start] = 0; while (roomToVisit.Count > 0) { var closestDist = int.MaxValue; DupdobRoom closestRoom = null; foreach (var room in roomToVisit.Where(room => distances[room] < closestDist)) { closestRoom = room; closestDist = distances[room]; } if (closestRoom == null) { break; } roomToVisit.Remove(closestRoom); foreach (var neighbour in closestRoom.Neighbours) { var newDist = closestDist + neighbour.Value; if (distances[neighbour.Key] > newDist) { distances[neighbour.Key] = newDist; } } if (closestRoom == exit) { return(distances[closestRoom]); } } return(-1); }
private void ParseInput(string input = Input) { var lineIndex = 0; var maxX = 0; foreach (var line in input.Split('\n')) { for (var i = 0; i < line.Length; i++) { // don't care for blocking rooms if (line[i] == '#' || line[i] == ' ') { continue; } var room = new DupdobRoom(i, lineIndex, line[i].ToString()); _map[(i, lineIndex)] = room;