Advertisement
StreetKatya

RobotAndZero

Feb 28th, 2023 (edited)
699
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.65 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace Robot
  9. {
  10.     internal class Program
  11.     {
  12.         static void Main(string[] args)
  13.         {
  14.             int[,] data;
  15.             int N;
  16.             using (var sr = new StreamReader("input.txt"))
  17.             {
  18.                 N = int.Parse(sr.ReadLine()); //Читаем из файла размер матрицы
  19.                 data = new int[N, N];
  20.                 for (int i = 0; i < N; i++)
  21.                 {
  22.                     string[] str = sr.ReadLine().Split(' '); //Читаем построчно элементы
  23.                     for (int j = 0; j < N; j++)
  24.                     {
  25.                         data[i, j] = int.Parse(str[j]);//Заносим в матрицу
  26.                     }
  27.                 }
  28.                 int MinValue = SearchMinPath(data, N);
  29.                 Console.WriteLine("MinValue = " + MinValue);
  30.                 int MaxValue = SearchMaxPath(data, N);
  31.                 Console.WriteLine("MaxValue = " + MaxValue);
  32.                 Console.ReadKey();
  33.             }
  34.         }
  35.         public static int SearchMaxPath(int[,] array, int N)
  36.         {
  37.             int[,] newArray = new int[N, N];
  38.             for (int i = 0; i < N; i++) //Копируем матрицу
  39.             {
  40.                 for (int j = 0; j < N; j++)
  41.                 {
  42.                     newArray[i, j] = array[i, j];
  43.                 }
  44.             }
  45.             bool flagIfZero = false;
  46.             for (int i = 1; i < N; i++) //Первая строка
  47.             {
  48.                 if (flagIfZero)
  49.                 {
  50.                     newArray[i, 0] = 0;
  51.                 }
  52.                 else if (newArray[i, 0] != 0)
  53.                 {
  54.                     newArray[i, 0] = newArray[i, 0] + newArray[i - 1, 0];
  55.                 }
  56.                 else flagIfZero = true;
  57.             }
  58.  
  59.             flagIfZero = false;
  60.  
  61.             for (int i = 1; i < N; i++) //Первый столбец
  62.             {
  63.                 if (flagIfZero)
  64.                 {
  65.                     newArray[0, i] = 0;
  66.                 }
  67.                 else if (newArray[0, i] != 0)
  68.                 {
  69.                     newArray[0, i] = newArray[0, i] + newArray[0, i - 1];
  70.                 }
  71.                 else flagIfZero = true;
  72.             }
  73.  
  74.             for (int i = 1; i < N; i++) //Заполнение центра матрицы (без боковых контуров)
  75.             {
  76.                 for (int j = 1; j < N; j++)
  77.                 {
  78.                     int MaxElement = SearchMaxElement(newArray, i, j); //Ищем максимальный элемент вокруг текущего в матрице
  79.                     if(MaxElement == 0)
  80.                     {
  81.                         newArray[i, j] = 0;
  82.                     }
  83.                     else newArray[i, j] = newArray[i, j] + MaxElement;//Прибавляем к текущему максимум
  84.                 }
  85.             }
  86.             int k = N - 1; int l = N - 1;
  87.             int current = newArray[k, l];
  88.             List<int> path = new List<int>();
  89.             path.Add(array[k,l]);
  90.             while(current != newArray[0,0])//Вывод пути
  91.             {
  92.                 if (k > 0 && current - newArray[k - 1, l] == array[k, l])//Проверка с верхним
  93.                 {
  94.                     path.Add(array[k - 1, l]);
  95.                     current = newArray[k - 1, l];
  96.                     k--;
  97.                 }
  98.                 else if (l > 0 && current - newArray[k, l - 1] == array[k, l])//Проверка с левым
  99.                 {
  100.                     path.Add(array[k, l - 1]);
  101.                     current = newArray[k, l - 1];
  102.                     l--;
  103.                 }
  104.             }
  105.             Console.Write("Path for max: ");
  106.             for (int i = path.Count-1; i >= 0; i--)
  107.             {
  108.                 Console.Write(" " + path[i]);
  109.             }
  110.             Console.WriteLine();
  111.             return newArray[N - 1, N - 1];
  112.         }
  113.         public static int SearchMaxElement(int[,] array, int i, int j)
  114.         {
  115.             int maxElement = -1;
  116.             bool flagMaxElement = false;
  117.             if (array[i - 1, j] > maxElement && array[i, j] != 0 && array[i - 1, j] != 0) //Проверяем с верхнимс левым
  118.             {
  119.                 maxElement = array[i - 1, j];
  120.                 flagMaxElement = true;
  121.             }
  122.             if (array[i, j - 1] > maxElement && array[i, j] != 0 && array[i, j - 1] != 0) //Проверяем с левым
  123.             {
  124.                 maxElement = array[i, j - 1];
  125.                 flagMaxElement = true;
  126.             }
  127.             if (flagMaxElement)
  128.             {
  129.                 return maxElement;
  130.             }
  131.             else return 0;
  132.         }
  133.         public static int SearchMinPath(int[,] array, int N)
  134.         {
  135.             int[,] newArray = new int[N, N];
  136.             for (int i = 0; i < N; i++) //Копируем матрицу
  137.             {
  138.                 for (int j = 0; j < N; j++)
  139.                 {
  140.                     newArray[i, j] = array[i, j];
  141.                 }
  142.             }
  143.             bool flagIfZero = false;
  144.             for (int i = 1; i < N; i++) //Первая строка
  145.             {
  146.                 if (flagIfZero)
  147.                 {
  148.                     newArray[i, 0] = 0;
  149.                 }
  150.                 else if (newArray[i, 0] != 0)
  151.                 {
  152.                     newArray[i, 0] = newArray[i, 0] + newArray[i - 1, 0];
  153.                 }
  154.                 else flagIfZero = true;
  155.             }
  156.  
  157.             flagIfZero = false;
  158.  
  159.             for (int i = 1; i < N; i++) //Первый столбец
  160.             {
  161.                 if (flagIfZero)
  162.                 {
  163.                     newArray[0, i] = 0;
  164.                 }
  165.                 else if (newArray[0, i] != 0)
  166.                 {
  167.                     newArray[0, i] = newArray[0, i] + newArray[0, i - 1];
  168.                 }
  169.                 else flagIfZero = true;
  170.             }
  171.  
  172.             for (int i = 1; i < N; i++) //Заполнение центра матрицы (без боковых контуров)
  173.             {
  174.                 for (int j = 1; j < N; j++)
  175.                 {
  176.                     int MinElement = SearchMinElement(newArray, i, j); //Ищем минимальный элемент вокруг текущего в матрице
  177.                     if(MinElement == 0)
  178.                     {
  179.                         newArray[i, j] = 0;
  180.                     }
  181.                     else newArray[i, j] = newArray[i, j] + MinElement;//Прибавляем к текущему минимум
  182.                 }
  183.             }
  184.             int k = N - 1; int l = N - 1;
  185.             int current = newArray[k, l];
  186.             List<int> path = new List<int>();
  187.             path.Add(array[k, l]);
  188.             while (current != newArray[0, 0])//Вывод пути
  189.             {
  190.                 if (k > 0 && current - newArray[k - 1, l] == array[k, l])//Проверка с верхним
  191.                 {
  192.                     path.Add(array[k - 1, l]);
  193.                     current = newArray[k - 1, l];
  194.                     k--;
  195.                 }
  196.                 else if (l > 0 && current - newArray[k, l - 1] == array[k, l])//Проверка с левым
  197.                 {
  198.                     path.Add(array[k, l - 1]);
  199.                     current = newArray[k, l - 1];
  200.                     l--;
  201.                 }
  202.             }
  203.             Console.Write("Path for min: ");
  204.             for (int i = path.Count - 1; i >= 0; i--)
  205.             {
  206.                 Console.Write(" " + path[i]);
  207.             }
  208.             Console.WriteLine();
  209.             return newArray[N - 1, N - 1];
  210.  
  211.         }
  212.         public static int SearchMinElement(int[,] array, int i, int j)
  213.         {
  214.             int minElement = int.MaxValue;
  215.             bool flagMinElement = false;
  216.             if (array[i - 1, j] < minElement && array[i, j] != 0 && array[i - 1, j] != 0) //Проверяем с верхнимс левым
  217.             {
  218.                 minElement = array[i - 1, j];
  219.                 flagMinElement = true;
  220.             }
  221.             if (array[i, j - 1] < minElement && array[i, j] != 0 && array[i, j - 1] != 0) //Проверяем с левым
  222.             {
  223.                 minElement = array[i, j - 1];
  224.                 flagMinElement = true;
  225.             }
  226.             if (flagMinElement)
  227.             {
  228.                 return minElement;
  229.             }
  230.             else return 0;
  231.         }
  232.     }
  233. }
  234.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement