Advertisement
StreetKatya

RobotAndChetnost

Mar 8th, 2023
802
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.90 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace RobotAndChetnost
  9. {
  10.     internal class Program
  11.     {
  12.         static void Main(string[] args)
  13.         {
  14.             using (var sr = new StreamReader("input.txt"))
  15.             {
  16.                 int n = int.Parse(sr.ReadLine());
  17.                 int[,] matrix = new int[n, n];
  18.                 for (int i = 0; i < n; i++)
  19.                 {
  20.                     string[] newString = sr.ReadLine().Split(' ');
  21.                     for (int j = 0; j < n; j++)
  22.                     {
  23.                         matrix[i, j] = int.Parse(newString[j]);
  24.                     }
  25.                 }
  26.                 Console.WriteLine("Minimal");
  27.                 Console.WriteLine("ResultMin = " + MinWay(matrix));
  28.                 Console.WriteLine();
  29.                 Console.WriteLine("Maximum");
  30.                 Console.WriteLine("ResultMax = " + MaxWay(matrix));
  31.                 Console.ReadKey();
  32.             }
  33.         }
  34.         //Если в клетке четное - вниз или направо
  35.         //Если в кретке нечетное - направо
  36.         public static int[,] DuplicateMatrix(int[,] matrix)
  37.         {
  38.             int[,] newmatrix = new int[matrix.GetLength(0), matrix.GetLength(0)];
  39.             for (int i = 0; i < matrix.GetLength(0); i++)
  40.             {
  41.                 for (int j = 0; j < matrix.GetLength(0); j++)
  42.                 {
  43.                     newmatrix[i, j] = matrix[i, j];
  44.                 }
  45.             }
  46.             return newmatrix;
  47.         }
  48.         public static void FirstString(int[,] array)
  49.         {
  50.             for (int i = 1; i < array.GetLength(0); i++)//Заполняем первую строку
  51.             {
  52.                 array[0, i] += array[0, i - 1];
  53.             }
  54.         }
  55.         public static void AllColumn(int[,] array)
  56.         {
  57.             bool nechet = false;//Флаг встречаемости нечетного числа
  58.             if (array[0, 0] % 2 != 0)//Проверяем самый первый элемент
  59.             {
  60.                 nechet = true;
  61.             }
  62.             for (int i = 1; i < array.GetLength(0); i++)//Идём по всем остальным
  63.             {
  64.                 if (!nechet)//Если нечетное не встретилось
  65.                 {
  66.                     array[i, 0] += array[i - 1, 0];
  67.                 }
  68.                 else array[i, 0] = -1;//Иначе все последующие заменяем на -1, потому что мы до них не сможем дойти
  69.                 if (array[i, 0] % 2 != 0)//Проверяем текущий на нечетность
  70.                 {
  71.                     nechet = true;
  72.                 }
  73.  
  74.             }
  75.  
  76.         }
  77.         public static int MinWay(int[,] matrix)
  78.         {
  79.             int[,] array = DuplicateMatrix(matrix);
  80.  
  81.             FirstString(array);
  82.             AllColumn(array);
  83.  
  84.             for (int i = 1; i < array.GetLength(0); i++)
  85.             {
  86.                 for (int j = 1; j < array.GetLength(0); j++)
  87.                 {
  88.                     int minEl = int.MaxValue;
  89.                     if (matrix[i - 1, j] % 2 == 0 && array[i - 1, j] < minEl)//Если верхний четный (значит мы могли прийти сверху и верхний меньше минимального
  90.                     {
  91.                         minEl = array[i - 1, j];
  92.                     }
  93.                     if (array[i, j - 1] != -1 && array[i, j - 1] < minEl)//Если левый не -1 (значит мы могли прийти слева) и левый меньше минимального
  94.                     {
  95.                         minEl = array[i, j - 1];
  96.                     }
  97.                     if (minEl != int.MaxValue)
  98.                     {
  99.                         array[i, j] += minEl;
  100.                     }
  101.                     else array[i, j] = -1;
  102.                 }
  103.             }
  104.             PrintWay(matrix, array);
  105.             return array[array.GetLength(0) - 1, array.GetLength(1) - 1];
  106.         }
  107.         public static int MaxWay(int[,] matrix)
  108.         {
  109.             int[,] array = DuplicateMatrix(matrix);
  110.  
  111.             FirstString(array);
  112.             AllColumn(array);
  113.  
  114.             for (int i = 1; i < array.GetLength(0); i++)
  115.             {
  116.                 for (int j = 1; j < array.GetLength(0); j++)
  117.                 {
  118.                     int minEl = 0;
  119.                     if (matrix[i - 1, j] % 2 == 0 && array[i - 1, j] > minEl)//Если верхний четный (значит мы могли прийти сверху и верхний меньше минимального
  120.                     {
  121.                         minEl = array[i - 1, j];
  122.                     }
  123.                     if (array[i, j - 1] != -1 && array[i, j - 1] > minEl)//Если левый не -1 (значит мы могли прийти слева) и левый меньше минимального
  124.                     {
  125.                         minEl = array[i, j - 1];
  126.                     }
  127.                     if (minEl != 0)//если минимальный существует
  128.                     {
  129.                         array[i, j] += minEl;
  130.                     }
  131.                     else array[i, j] = -1;//если никакой не подошёл
  132.                 }
  133.             }
  134.             PrintWay(matrix, array);
  135.             return array[array.GetLength(0) - 1, array.GetLength(1) - 1];
  136.         }
  137.         public static void PrintWay(int[,] matrix, int[,] array)
  138.         {
  139.             Stack<int> stack = new Stack<int>(); //Последний зашёл - последний вышел
  140.             for (int i = matrix.GetLength(0) - 1; i >= 0;)
  141.             {
  142.                 for (int j = matrix.GetLength(0) - 1; j >= 0;)
  143.                 {
  144.                     if (j > 0 && array[i, j] - array[i, j - 1] == matrix[i, j])//мы пришли слева
  145.                     {
  146.                         stack.Push(matrix[i, j]);
  147.                         j--;
  148.                     }
  149.                     else if (i > 0 && array[i, j] - array[i - 1, j] == matrix[i, j])//мы пришли сверху
  150.                     {
  151.                         stack.Push(matrix[i, j]);
  152.                         i--;
  153.                     }
  154.                     if(i == 0 && j == 0)
  155.                     {
  156.                         stack.Push(matrix[i, j]);
  157.                         i--;
  158.                         j--;
  159.                     }
  160.                 }
  161.             }
  162.             Console.WriteLine("Way");
  163.             for (int i = 0; i < stack.Count; i++)
  164.             {
  165.                 Console.WriteLine(stack.Pop());//Pop - возвращает вершину и удаляет
  166.             }
  167.             Console.WriteLine();
  168.         }
  169.     }
  170. }
  171.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement