Program.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace ConsoleApplication11
  7. {
  8. class Program
  9. {
  10. struct Element
  11. {
  12. public int Delivery { get; set; }
  13. public int Value { get; set; }
  14. public static int FindMinElement(int a, int b)
  15. {
  16. if (a > b) return b;
  17. if (a == b) { return a; }
  18. else return a;
  19. }
  20. }
  21. static void Main(string[] args)
  22. {
  23. int i = 0;
  24. int j = 0; // переменные
  25. int n;
  26. int max = 0;
  27. int sumM = 0;
  28. int sumN = 0;
  29. string vixod = "y";
  30. Console.WriteLine("Сделать первоначальное распределение по методу северо-западного угла в транспортной задаче \nс учетом преобразования исходной матрицы А в матрицу В по правилу: В = { mахл + 1}-А\n");
  31. do
  32. {
  33. try
  34. {
  35. Console.ForegroundColor = ConsoleColor.Green;
  36. Console.WriteLine("Введите количество столбцов"); // ввод значений в переменные
  37. n = Convert.ToInt32(Console.ReadLine());
  38. int[] a = new int[n];
  39. Console.ForegroundColor = ConsoleColor.Green;
  40. Console.WriteLine("Введите количество строк");
  41. int m = Convert.ToInt32(Console.ReadLine());
  42. int[] b = new int[m];
  43. Element[,] C = new Element[n, m];
  44. Console.ForegroundColor = ConsoleColor.Yellow;
  45. Console.WriteLine("Введите M");
  46. for (i = 0; i < a.Length; i++)
  47. {
  48. a[i] = Convert.ToInt32(Console.ReadLine());
  49. }
  50. Console.WriteLine("Введите N");
  51. for (j = 0; j < b.Length; j++)
  52. {
  53. b[j] = Convert.ToInt32(Console.ReadLine());
  54. }
  55. Console.ForegroundColor = ConsoleColor.White;
  56. for (i = 0; i < a.Length; i++)
  57. {
  58. sumM += a[i];
  59. }
  60. for (j = 0; j < b.Length; j++)
  61. {
  62. sumN += b[j];
  63. }
  64. if (sumM == sumN)
  65. {
  66. Console.WriteLine("\nВведите числа в матрицу\n");
  67. for (i = 0; i < n; i++)
  68. {
  69. for (j = 0; j < m; j++)
  70. {
  71. Console.Write("a[{0},{1}] = ", i, j);
  72. Console.ForegroundColor = ConsoleColor.Cyan;
  73. C[i, j].Value = Convert.ToInt32(Console.ReadLine()); // ввод значений в матрицу
  74. Console.ResetColor();
  75. }
  76. }
  77. for (i = 0; i < n; i++)
  78. {
  79. for (j = 0; j < m; j++)
  80. {
  81. if (max <= C[i, j].Value) // поиск максимального числа
  82. {
  83. max = C[i, j].Value;
  84. }
  85. }
  86. }
  87. max += 1; // прибавление 1 к максимальному числу
  88. for (i = 0; i < n; i++)
  89. {
  90. for (j = 0; j < m; j++)
  91. {
  92. if (C[i, j].Value != 0)
  93. {
  94. C[i, j].Value = max - C[i, j].Value;
  95. }
  96. }
  97. }
  98. i = j = 0;
  99. while (i < n && j < m) // цикл для северозападного метода
  100. {
  101. try
  102. {
  103. if (a[i] == 0) { i++; }
  104. if (b[j] == 0) { j++; }
  105. if (a[i] == 0 && b[j] == 0) { i++; j++; }
  106. C[i, j].Delivery = Element.FindMinElement(a[i], b[j]);
  107. a[i] -= C[i, j].Delivery;
  108. b[j] -= C[i, j].Delivery;
  109. }
  110. catch { }
  111. }
  112. //выводим массив на экран
  113. Console.WriteLine("\nКонечная матрица\n");
  114. for (i = 0; i < n; i++)
  115. {
  116. for (j = 0; j < m; j++)
  117. {
  118. if (C[i, j].Delivery != 0)
  119. {
  120. if (j == 0)
  121. {
  122. Console.Write("|");
  123. }
  124. Console.ForegroundColor = ConsoleColor.DarkCyan;
  125. Console.Write(" {0}", C[i, j].Value);
  126. Console.ForegroundColor = ConsoleColor.DarkGreen;
  127. Console.Write("({0})", C[i, j].Delivery); Console.ResetColor();
  128. Console.Write(" |");
  129. }
  130. else
  131. {
  132. if (j == 0)
  133. {
  134. Console.Write("|");
  135. }
  136. Console.Write(" {0}({1})", C[i, j].Value, C[i, j].Delivery);
  137. Console.Write(" |");
  138. }
  139. }
  140. Console.WriteLine();
  141. }
  142. int ResultFunction = 0;
  143. //считаем целевую функцию
  144. for (i = 0; i < n; i++)
  145. {
  146. for (j = 0; j < m; j++) { ResultFunction += (C[i, j].Value * C[i, j].Delivery); }
  147. }
  148. Console.ForegroundColor = ConsoleColor.Green;
  149. Console.WriteLine(" \nОтвет = {0} у.д.е", ResultFunction);
  150. Console.ResetColor();
  151. i = 0;
  152. j = 0;
  153. int[] u = new int[n];
  154. int[] v = new int[m];
  155. }
  156. else
  157. {
  158. Console.ForegroundColor = ConsoleColor.Red;
  159. Console.WriteLine("M не равно N");
  160. }
  161. Console.WriteLine("\nВведите y для продолжения или любой другой символ для выхода");
  162. vixod = Console.ReadLine();
  163. }
  164. catch (Exception)
  165. {
  166. Console.ForegroundColor = ConsoleColor.Red;
  167. Console.WriteLine("\nПроверьте введенные данные\n");
  168. }
  169. }
  170. while (vixod == "y");
  171. }
  172. }
  173. }