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;