Advertisement
Pearlfromsu

ffff

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