Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace Beaver_Work
- {
- class Program
- {
- //деклариране на константите
- const char BEAVER = 'B';
- const char FISH = 'F';
- const char FREE = '-';
- const char FIRST_WOOD = 'a';
- const char LAST_WOOD = 'z';
- static void Main(string[] args)
- {
- int n = int.Parse(Console.ReadLine());
- //инициализиране на променливите и запълване на матрицата
- int countWoods = 0;
- char[,] pond = new char[n, n];
- int maxRowPond = pond.GetUpperBound(0);
- int minRowPond = pond.GetLowerBound(0);
- int maxColPond = pond.GetUpperBound(1);
- int minColPond = pond.GetLowerBound(1);
- int currentBeaverRow = 0;
- int currentBeaverCol = 0;
- for (int r = 0; r < n; r++)
- {
- char[] temp = Console.ReadLine().Split(' ').Select(char.Parse).ToArray();
- for (int c = 0; c < temp.Length; c++)
- {
- if (IsHasWood(temp[c]))
- {
- countWoods++;
- }
- if (temp[c] == BEAVER)
- {
- currentBeaverRow = r;
- currentBeaverCol = c;
- }
- pond[r, c] = temp[c];
- }
- }
- List<char> collectedWool = new List<char>();
- bool isLoopExit = false;
- bool isCollectAllWood = false;
- // цикъл за обработка на командите за движение
- while ((!isCollectAllWood) && (!isLoopExit))
- {
- string input = Console.ReadLine().ToLower();
- if (input.Equals("end"))
- {
- isLoopExit = true;
- }
- else
- {
- //начални стойности на стъпките
- int rowStep = 0;
- int colStep = 0;
- //инициализиране на стойностите на стъпките съобразно подадените команди за посока
- switch (input)
- {
- case "up":
- rowStep--;
- break;
- case "down":
- rowStep++;
- break;
- case "left":
- colStep--;
- break;
- case "right":
- colStep++;
- break;
- default:
- break;
- }
- //изчисляване на новите координати на бобъра
- int nextRowPosition = currentBeaverRow + rowStep;
- int nextColPosition = currentBeaverCol + colStep;
- //проверка за валидност на новите координати на бобъра
- if (IsValidIndex(maxRowPond, maxColPond, nextRowPosition, nextColPosition))
- {
- // ако новите координати са валидни маркиране на старата позиция на бобъра като свободна и задаване на
- //нови текущи координати за позиция на бобъра
- pond[currentBeaverRow, currentBeaverCol] = FREE;
- currentBeaverRow = nextRowPosition;
- currentBeaverCol = nextColPosition;
- char charInBeaverPosition = pond[currentBeaverRow, currentBeaverCol];
- //ако на новата позиция на бобъра има риба
- if (charInBeaverPosition.Equals(FISH))
- {
- pond[currentBeaverRow, currentBeaverCol] = FREE;
- // придвижване с една позиция напред под вода
- int goUnderWaterRow = currentBeaverRow + rowStep;
- int goUnderWaterCol = currentBeaverCol + colStep;
- // ако новата позоция е валидна, преместване на текущите координати на бобъра до края на езерото
- //в същата посока
- if (IsValidIndex(maxRowPond, maxColPond, goUnderWaterRow, goUnderWaterCol))
- {
- int newRowIndex = currentBeaverRow;
- int newColIndex = currentBeaverCol;
- if (rowStep == -1)
- {
- newRowIndex = minRowPond;
- }
- else if (rowStep == 1)
- {
- newRowIndex = maxRowPond;
- }
- else if (colStep == -1)
- {
- newColIndex = minColPond;
- }
- else
- {
- newColIndex = maxColPond;
- }
- currentBeaverRow = newRowIndex;
- currentBeaverCol = newColIndex;
- }
- else
- {
- // ако рибата е била на ръба преместване на новите координати на бобъра на отсрещния бряг на езерото
- //ако преместването е по дължината на реда (преместване по хоризонтал)
- if (goUnderWaterRow == currentBeaverRow)
- {
- // преместване на текущите координати на бобъра на срещуположния край на реда
- currentBeaverRow = goUnderWaterRow;
- currentBeaverCol = maxColPond + 1 + (-1) * goUnderWaterCol * colStep;
- }
- // ако преместването е по височината на колоната (движение по вертикал)
- else if (goUnderWaterCol == currentBeaverCol)
- {
- //преместване на срещуположния край на колоната
- currentBeaverRow = maxRowPond + 1 + (-1) * goUnderWaterRow * rowStep;
- currentBeaverCol = goUnderWaterCol;
- }
- }
- }
- // проверка дали на текущата позиция на бобъра има дърво
- if (IsHasWood(charInBeaverPosition))
- {
- collectedWool.Add(charInBeaverPosition);
- countWoods--;
- pond[currentBeaverRow, currentBeaverCol] = FREE;
- //Ако бобъра е събрал всички дървета установяване на флага за събрани всички дървета
- if (countWoods == 0)
- {
- isCollectAllWood = true;
- }
- }
- }
- //ако бобъра се "удари" в ръба на езерото
- else
- {
- //ако бобъра е събрал поне едно дърво, губи последното събрано дърво
- if (collectedWool.Count > 0)
- {
- collectedWool.RemoveAt(collectedWool.Count - 1);
- }
- }
- }
- }
- //маркиране на текущата позиция на бобъра
- pond[currentBeaverRow, currentBeaverCol] = BEAVER;
- // отпечатване на резултатите
- StringBuilder sb = new StringBuilder();
- if (isCollectAllWood)
- {
- sb.AppendLine($"The Beaver successfully collect {collectedWool.Count} wood branches: {string.Join(", ", collectedWool)}.");
- }
- else
- {
- sb.AppendLine($"The Beaver failed to collect every wood branch. There are {countWoods} branches left.");
- }
- for (int row = 0; row <= maxRowPond; row++)
- {
- StringBuilder temp = new StringBuilder();
- for (int col = 0; col <= maxColPond; col++)
- {
- if (col == maxColPond)
- {
- temp.Append(pond[row, col].ToString());
- }
- else
- {
- temp.Append(pond[row, col].ToString() + " ");
- }
- }
- sb.AppendLine(temp.ToString());
- }
- Console.WriteLine(sb.ToString().TrimEnd());
- }
- // помощен метод за проверка на валидността на координатите (индексите на матрицата) на позицията на бобъра
- private static bool IsValidIndex(int maxRowPond, int maxColPond, int nextRowPosition, int nextColPosition)
- {
- bool result = ((nextRowPosition >= 0) && (nextRowPosition <= maxRowPond));
- result = ((result) && (nextColPosition >= 0) && (nextColPosition <= maxColPond));
- return result;
- }
- //Помощен метод за определяне дали на текущата позиция на бобъра има дърво
- private static bool IsHasWood(char ch)
- {
- if ((ch >= FIRST_WOOD) && (ch <= LAST_WOOD))
- {
- return true;
- }
- return false;
- }
- }
- }
Add Comment
Please, Sign In to add comment