Advertisement
vvsvvs

Untitled

May 23rd, 2022
773
147 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace Beaver_Work
  7. {
  8.     class Program
  9.     {
  10.         //деклариране на константите
  11.         const char BEAVER = 'B';
  12.         const char FISH = 'F';
  13.         const char FREE = '-';
  14.         const char FIRST_WOOD = 'a';
  15.         const char LAST_WOOD = 'z';
  16.  
  17.         static void Main(string[] args)
  18.         {
  19.             int n = int.Parse(Console.ReadLine());
  20.             //инициализиране на променливите и запълване на матрицата
  21.             int countWoods = 0;
  22.  
  23.             char[,] pond = new char[n, n];
  24.  
  25.             int maxRowPond = pond.GetLength(0);
  26.             int maxColPond = pond.GetLength(1);
  27.  
  28.             int currentBeaverRow = 0;
  29.             int currentBeaverCol = 0;
  30.  
  31.             for (int r = 0; r < n; r++)
  32.             {
  33.                 char[] temp = Console.ReadLine().Split(' ').Select(char.Parse).ToArray();
  34.  
  35.                 for (int c = 0; c < temp.Length; c++)
  36.                 {
  37.                     if ((temp[c] >= FIRST_WOOD) && (temp[c] <= LAST_WOOD))
  38.                     {
  39.                         countWoods++;
  40.                     }
  41.  
  42.                     if (temp[c] == BEAVER)
  43.                     {
  44.                         currentBeaverRow = r;
  45.                         currentBeaverCol = c;
  46.                     }
  47.                     pond[r, c] = temp[c];
  48.                 }
  49.             }
  50.  
  51.             List<char> collectedWool = new List<char>();
  52.  
  53.             bool isLoopExit = false;
  54.             bool isCollectAllWood = false;
  55.  
  56.             // цикъл за обработка на командите за движение
  57.             while ((!isCollectAllWood) && (!isLoopExit))
  58.             {
  59.                 string input = Console.ReadLine().ToLower();
  60.  
  61.                 if (input.Equals("end"))
  62.                 {
  63.                     isLoopExit = true;
  64.                 }
  65.                 else
  66.                 {
  67.                     //начални стойности на стъпките
  68.                     int rowStep = 0;
  69.                     int colStep = 0;
  70.  
  71.                     //инициализиране на стойностите на стъпките съобразно подадените команди за посока
  72.                     switch (input)
  73.                     {
  74.                         case "up":
  75.                             rowStep--;
  76.                             break;
  77.                         case "down":
  78.                             rowStep++;
  79.                             break;
  80.                         case "left":
  81.                             colStep--;
  82.                             break;
  83.                         case "right":
  84.                             colStep++;
  85.                             break;
  86.                         default:
  87.                             break;
  88.                     }
  89.                     //изчисляване на новите координати на бобъра
  90.                     int nextRowPosition = currentBeaverRow + rowStep;
  91.                     int nextColPosition = currentBeaverCol + colStep;
  92.  
  93.                     //проверка за валидност на новите координати на бобъра
  94.                     if (IsValidIndex(maxRowPond, maxColPond, nextRowPosition, nextColPosition))
  95.                     {
  96.                         // ако новите координати са валидни маркиране на старата позиция на бобъра като свободна и задаване на
  97.                         //нови текущи координати за позиция на бобъра
  98.                         pond[currentBeaverRow, currentBeaverCol] = FREE;
  99.  
  100.                         currentBeaverRow = nextRowPosition;
  101.                         currentBeaverCol = nextColPosition;
  102.  
  103.                         char charInBeaverPosition = pond[currentBeaverRow, currentBeaverCol];
  104.  
  105.                         //ако на новата позиция на бобъра има риба
  106.                         if (charInBeaverPosition.Equals(FISH))
  107.                         {
  108.                             pond[currentBeaverRow, currentBeaverCol] = FREE;
  109.  
  110.                             // придвижване с една позиция напред под вода
  111.                             int goUnderWaterRow = currentBeaverRow + rowStep;
  112.                             int goUnderWaterCol = currentBeaverCol + colStep;
  113.  
  114.                             // ако новата позоция е валидна, преместване на текущите координати на бобъра до края на езерото
  115.                             //в същата посока
  116.                             if (IsValidIndex(maxRowPond, maxColPond, goUnderWaterRow, goUnderWaterCol))
  117.                             {
  118.                                 int newRowIndex = currentBeaverRow;
  119.                                 int newColIndex = currentBeaverCol;
  120.  
  121.                                 if (rowStep == -1)
  122.                                 {
  123.                                     newRowIndex = 0;
  124.                                 }
  125.                                 else if (rowStep == 1)
  126.                                 {
  127.                                     newRowIndex = maxRowPond;
  128.                                 }
  129.                                 else if (colStep == -1)
  130.                                 {
  131.                                     newColIndex = 0;
  132.                                 }
  133.                                 else
  134.                                 {
  135.                                     newColIndex = maxColPond;
  136.                                 }
  137.  
  138.                                 currentBeaverRow = newRowIndex;
  139.                                 currentBeaverCol = newColIndex;
  140.                             }
  141.                             else
  142.                             {
  143.                                 // ако рибата е била на ръба преместване на новите координати на бобъра на отсрещния бряг на езерото
  144.  
  145.                                 //ако преместването е по дължината на реда (преместване по хоризонтал)
  146.                                 if (goUnderWaterRow == currentBeaverRow)
  147.                                 {
  148.                                     // преместване на текущите координати на бобъра на срещуположния край на реда
  149.                                     currentBeaverRow = goUnderWaterRow;
  150.                                     currentBeaverCol = maxColPond + (-1) * goUnderWaterCol * colStep;
  151.                                 }
  152.                                 // ако преместването е по височината на колоната (движение по вертикал)
  153.                                 else if (goUnderWaterCol == currentBeaverCol)
  154.                                 {
  155.                                     //преместване на срещуположния край на колоната
  156.                                     currentBeaverRow = maxRowPond + (-1) * goUnderWaterRow * rowStep;
  157.                                     currentBeaverCol = goUnderWaterCol;
  158.                                 }
  159.                             }
  160.                         }
  161.  
  162.                         // проверка дали на текущата позиция на бобъра има дърво
  163.                         if (IsHasWood(charInBeaverPosition))
  164.                         {
  165.                             collectedWool.Add(charInBeaverPosition);
  166.                             countWoods--;
  167.                             pond[currentBeaverRow, currentBeaverCol] = FREE;
  168.  
  169.                             //Ако бобъра е събрал всички дървета установяване на флага за събрани всички дървета
  170.                             if (countWoods == 0)
  171.                             {
  172.                                 isCollectAllWood = true;
  173.                             }
  174.                         }
  175.                     }
  176.  
  177.                     //ако бобъра се "удари" в ръба на езерото
  178.                     else
  179.                     {
  180.                         //ако бобъра е събрал поне едно дърво, губи последното събрано дърво
  181.                         if (collectedWool.Count > 0)
  182.                         {
  183.                             collectedWool.RemoveAt(collectedWool.Count - 1);
  184.                         }
  185.                     }
  186.  
  187.                     //маркиране на текущата позиция на бобъра
  188.                     pond[currentBeaverRow, currentBeaverCol] = BEAVER;
  189.                 }
  190.             }
  191.  
  192.             // отпечатване на резултатите
  193.             StringBuilder sb = new StringBuilder();
  194.            
  195.             if (isCollectAllWood)
  196.             {
  197.                 sb.AppendLine($"The Beaver successfully collect {collectedWool.Count} wood branches: {string.Join(", ", collectedWool)}.");
  198.             }
  199.             else
  200.             {
  201.                 sb.AppendLine($"The Beaver failed to collect every wood branch. There are {countWoods} branches left.");
  202.  
  203.             }            
  204.  
  205.             for (int row = 0; row < maxRowPond; row++)
  206.             {
  207.                 StringBuilder temp = new StringBuilder();
  208.  
  209.                 int colLessOne = maxColPond - 1;
  210.  
  211.                 for (int col = 0; col < colLessOne + 1; col++)
  212.                 {
  213.                     if (col == colLessOne)
  214.                     {
  215.                         temp.Append(pond[row, col].ToString());
  216.                     }
  217.                     else
  218.                     {
  219.                         temp.Append(pond[row, col].ToString() + " ");
  220.                     }
  221.                 }
  222.  
  223.                 sb.AppendLine(temp.ToString());
  224.             }
  225.  
  226.             Console.WriteLine(sb.ToString().TrimEnd());
  227.         }
  228.  
  229.         private static bool IsValidIndex(int maxRowPond, int maxColPond, int nextRowPosition, int nextColPosition)
  230.         {
  231.             bool result = ((nextRowPosition >= 0) && (nextRowPosition < maxRowPond));
  232.             result = ((result) && (nextColPosition >= 0) && (nextColPosition < maxColPond));
  233.             return result;
  234.         }
  235.  
  236.         private static bool IsHasWood(char ch)
  237.         {
  238.  
  239.             if ((ch >= FIRST_WOOD) && (ch <= LAST_WOOD))
  240.             {
  241.                 return true;
  242.             }
  243.  
  244.             return false;
  245.         }
  246.     }
  247. }
  248.  
Advertisement
RAW Paste Data Copied
Advertisement