Example #1
0
        private static void ReadInput()
        {
            var xYZ = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
            var lRC = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();

            startingPosition = new Position()
            {
                Level = xYZ[0],
                Row = xYZ[1],
                Col = xYZ[2],
                MovesCount = 0
            };

            levelsCount = lRC[0];
            rowsCount = lRC[1];
            colsCount = lRC[2];

            labyrinth = new Dictionary<int, char[,]>();
            visited = new Dictionary<int, bool[,]>();

            for (int level = 0; level < levelsCount; level++)
            {
                labyrinth.Add(level, new char[rowsCount, colsCount]);
                visited.Add(level, new bool[rowsCount, colsCount]);

                for (int row = 0; row < rowsCount; row++)
                {
                    var line = Console.ReadLine();

                    for (int col = 0; col < colsCount; col++)
                    {
                        labyrinth[level][row, col] = line[col];

                        if (line[col] == '#')
                        {
                            visited[level][row, col] = true;
                        }
                    }
                }
            }
        }
Example #2
0
        private static int FindMinimumNumberOfMoves(Position start)
        {
            Queue<Position> queue = new Queue<Position>();
            queue.Enqueue(start);

            visited[start.Level][start.Row, start.Col] = true;

            while (queue.Count != 0)
            {
                var currentPosition = queue.Dequeue();

                //Console.WriteLine("Level: {0}, Row: {1}, Col: {2}, Moves: {3}", currentPosition.Level, currentPosition.Row, currentPosition.Col, currentPosition.MovesCount);

                bool hasStepedOnLadder = false;

                if (labyrinth[currentPosition.Level][currentPosition.Row, currentPosition.Col] == 'D')
                {
                    if (currentPosition.Level - 1 < 0)
                    {
                        return currentPosition.MovesCount + 1;
                    }

                    currentPosition.Level--;
                    hasStepedOnLadder = true;
                }
                else if (labyrinth[currentPosition.Level][currentPosition.Row, currentPosition.Col] == 'U')
                {
                    if (currentPosition.Level + 1 >= levelsCount)
                    {
                        return currentPosition.MovesCount + 1;
                    }

                    currentPosition.Level++;
                    hasStepedOnLadder = true;
                }

                if (hasStepedOnLadder)
                {
                    if (!visited[currentPosition.Level][currentPosition.Row, currentPosition.Col])
                    {
                        currentPosition.MovesCount++;
                        queue.Enqueue(currentPosition);

                        visited[currentPosition.Level][currentPosition.Row, currentPosition.Col] = true;
                    }
                }
                else
                {
                    for (int i = 0; i < DirectionsCount; i++)
                    {
                        var nextRow = currentPosition.Row + xDirections[i];
                        var nextCol = currentPosition.Col + yDirections[i];

                        if (IsValidCell(nextRow, nextCol) && visited[currentPosition.Level][nextRow, nextCol] == false)
                        {
                            queue.Enqueue(new Position()
                            {
                                Level = currentPosition.Level,
                                Row = nextRow,
                                Col = nextCol,
                                MovesCount = currentPosition.MovesCount + 1
                            });

                            visited[currentPosition.Level][nextRow, nextCol] = true;
                        }
                    }
                }
            }

            return 0;
        }