|
@@ -0,0 +1,178 @@
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Linq;
|
|
|
+using System.Text;
|
|
|
+using System.Threading.Tasks;
|
|
|
+
|
|
|
+namespace ConsoleApplication11
|
|
|
+{
|
|
|
+ class Program
|
|
|
+ {
|
|
|
+ struct Element
|
|
|
+ {
|
|
|
+
|
|
|
+ public int Delivery { get; set; }
|
|
|
+ public int Value { get; set; }
|
|
|
+ public static int FindMinElement(int a, int b)
|
|
|
+ {
|
|
|
+ if (a > b) return b;
|
|
|
+ if (a == b) { return a; }
|
|
|
+ else return a;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ static void Main(string[] args)
|
|
|
+ {
|
|
|
+ int i = 0;
|
|
|
+ int j = 0; // переменные
|
|
|
+ int n;
|
|
|
+ int max = 0;
|
|
|
+ int sumM = 0;
|
|
|
+ int sumN = 0;
|
|
|
+ string vixod = "y";
|
|
|
+ Console.WriteLine("Сделать первоначальное распределение по методу северо-западного угла в транспортной задаче \nс учетом преобразования исходной матрицы А в матрицу В по правилу: В = { mахл + 1}-А\n");
|
|
|
+ do
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Console.ForegroundColor = ConsoleColor.Green;
|
|
|
+ Console.WriteLine("Введите количество столбцов"); // ввод значений в переменные
|
|
|
+ n = Convert.ToInt32(Console.ReadLine());
|
|
|
+ int[] a = new int[n];
|
|
|
+ Console.ForegroundColor = ConsoleColor.Green;
|
|
|
+ Console.WriteLine("Введите количество строк");
|
|
|
+ int m = Convert.ToInt32(Console.ReadLine());
|
|
|
+ int[] b = new int[m];
|
|
|
+ Element[,] C = new Element[n, m];
|
|
|
+ Console.ForegroundColor = ConsoleColor.Yellow;
|
|
|
+ Console.WriteLine("Введите M");
|
|
|
+ for (i = 0; i < a.Length; i++)
|
|
|
+ {
|
|
|
+ a[i] = Convert.ToInt32(Console.ReadLine());
|
|
|
+ }
|
|
|
+ Console.WriteLine("Введите N");
|
|
|
+ for (j = 0; j < b.Length; j++)
|
|
|
+ {
|
|
|
+ b[j] = Convert.ToInt32(Console.ReadLine());
|
|
|
+ }
|
|
|
+ Console.ForegroundColor = ConsoleColor.White;
|
|
|
+ for (i = 0; i < a.Length; i++)
|
|
|
+ {
|
|
|
+ sumM += a[i];
|
|
|
+ }
|
|
|
+ for (j = 0; j < b.Length; j++)
|
|
|
+ {
|
|
|
+ sumN += b[j];
|
|
|
+ }
|
|
|
+ if (sumM == sumN)
|
|
|
+ {
|
|
|
+ Console.WriteLine("\nВведите числа в матрицу\n");
|
|
|
+ for (i = 0; i < n; i++)
|
|
|
+ {
|
|
|
+ for (j = 0; j < m; j++)
|
|
|
+ {
|
|
|
+ Console.Write("a[{0},{1}] = ", i, j);
|
|
|
+ Console.ForegroundColor = ConsoleColor.Cyan;
|
|
|
+ C[i, j].Value = Convert.ToInt32(Console.ReadLine()); // ввод значений в матрицу
|
|
|
+ Console.ResetColor();
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (i = 0; i < n; i++)
|
|
|
+ {
|
|
|
+ for (j = 0; j < m; j++)
|
|
|
+ {
|
|
|
+ if (max <= C[i, j].Value) // поиск максимального числа
|
|
|
+ {
|
|
|
+ max = C[i, j].Value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ max += 1; // прибавление 1 к максимальному числу
|
|
|
+ for (i = 0; i < n; i++)
|
|
|
+ {
|
|
|
+ for (j = 0; j < m; j++)
|
|
|
+ {
|
|
|
+ if (C[i, j].Value != 0)
|
|
|
+ {
|
|
|
+ C[i, j].Value = max - C[i, j].Value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ i = j = 0;
|
|
|
+ while (i < n && j < m) // цикл для северозападного метода
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if (a[i] == 0) { i++; }
|
|
|
+ if (b[j] == 0) { j++; }
|
|
|
+ if (a[i] == 0 && b[j] == 0) { i++; j++; }
|
|
|
+ C[i, j].Delivery = Element.FindMinElement(a[i], b[j]);
|
|
|
+ a[i] -= C[i, j].Delivery;
|
|
|
+ b[j] -= C[i, j].Delivery;
|
|
|
+ }
|
|
|
+ catch { }
|
|
|
+ }
|
|
|
+ //выводим массив на экран
|
|
|
+ Console.WriteLine("\nКонечная матрица\n");
|
|
|
+ for (i = 0; i < n; i++)
|
|
|
+ {
|
|
|
+ for (j = 0; j < m; j++)
|
|
|
+ {
|
|
|
+ if (C[i, j].Delivery != 0)
|
|
|
+ {
|
|
|
+ if (j == 0)
|
|
|
+ {
|
|
|
+ Console.Write("|");
|
|
|
+ }
|
|
|
+ Console.ForegroundColor = ConsoleColor.DarkCyan;
|
|
|
+ Console.Write(" {0}", C[i, j].Value);
|
|
|
+ Console.ForegroundColor = ConsoleColor.DarkGreen;
|
|
|
+ Console.Write("({0})", C[i, j].Delivery); Console.ResetColor();
|
|
|
+ Console.Write(" |");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (j == 0)
|
|
|
+ {
|
|
|
+ Console.Write("|");
|
|
|
+ }
|
|
|
+ Console.Write(" {0}({1})", C[i, j].Value, C[i, j].Delivery);
|
|
|
+ Console.Write(" |");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Console.WriteLine();
|
|
|
+ }
|
|
|
+ int ResultFunction = 0;
|
|
|
+ //считаем целевую функцию
|
|
|
+ for (i = 0; i < n; i++)
|
|
|
+ {
|
|
|
+ for (j = 0; j < m; j++) { ResultFunction += (C[i, j].Value * C[i, j].Delivery); }
|
|
|
+ }
|
|
|
+ Console.ForegroundColor = ConsoleColor.Green;
|
|
|
+ Console.WriteLine(" \nОтвет = {0} у.д.е", ResultFunction);
|
|
|
+ Console.ResetColor();
|
|
|
+ i = 0;
|
|
|
+ j = 0;
|
|
|
+ int[] u = new int[n];
|
|
|
+ int[] v = new int[m];
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Console.ForegroundColor = ConsoleColor.Red;
|
|
|
+ Console.WriteLine("M не равно N");
|
|
|
+ }
|
|
|
+ Console.WriteLine("\nВведите y для продолжения или любой другой символ для выхода");
|
|
|
+ vixod = Console.ReadLine();
|
|
|
+ }
|
|
|
+ catch (Exception)
|
|
|
+ {
|
|
|
+ Console.ForegroundColor = ConsoleColor.Red;
|
|
|
+ Console.WriteLine("\nПроверьте введенные данные\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ while (vixod == "y");
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|