using System;
namespace ConsoleApplication11
{
class Program
{
struct Element
{
public int Delivery { get; set; }
public int Value { get; set; }
public static int FindMin(int a, int b)
{
return (a <= b) ? a : b;
}
}
static void Main(string[] args)
{
// Перезапустить программу с этой метки, если задача открытая.
Restart:
// i - Для прохода по складам поставщиков,
// j - Для прохода по складам потребителей
int i = 0, j = 0;
int numberOfSuppliers, numberOfConsumers;
int[] a = GetNumberOfSuppliers(out numberOfSuppliers);
int[] b = GetNumberOfConsumers(out numberOfConsumers);
// Расходная матрица = двумерный массив из числа поставщиков и потребителей.
Element[,] C = new Element[numberOfSuppliers, numberOfConsumers];
a = GetVolumeOfSupply(i, a);
b = GetNeedOfConsumption(j, b);
// Проверка на закрытость.
bool isItClosedTask = true;
int sumVolume = 0;
int sumNeed = 0;
for (i = 0; i < a.Length; i++)
{
sumVolume += a[i];
}
for (j = 0; j < b.Length; j++)
{
sumNeed += b[j];
}
if (sumVolume == sumNeed)
{
isItClosedTask = true;
}
else if (sumVolume < sumNeed)
{
isItClosedTask = false;
Console.WriteLine("На складах больше продукции, чем требуется.");
Console.WriteLine("Введите фиктивного потребителя с потребностью в {0}",
sumVolume - sumNeed);
Console.ReadLine();
goto Restart;
/* Process.Start(Assembly.GetExecutingAssembly().Location);
Environment.Exit(0);*/
}
else if (sumVolume > sumNeed)
{
isItClosedTask = false;
Console.WriteLine("На складах меньше продукции, чем требуется.");
Console.WriteLine("Введите фиктивный склад с объёмом в {0}",
sumNeed - sumVolume);
Console.ReadLine();
goto Restart;
/* Process.Start(Assembly.GetExecutingAssembly().Location);
Environment.Exit(0);*/
}
RenderTitle();
Console.WriteLine("Матрица стоимости:");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Введите C[i][j]");
for (i = 0; i < numberOfSuppliers; i++)
{
for (j = 0; j < numberOfConsumers; j++)
{
Console.Write("a[{0},{1}] = ", i, j);
C[i, j].Value = Convert.ToInt32(Console.ReadLine());
}
}
i = j = 0;
/*
Алгоритм решения методом северо-западного угла.
Движемся с "северо-западного" элемента расходной матрицы.
При a[i] = 0, то => i++ (Склад опустошен)
При b[j] = 0, то => j++ (Потребитель удовлтворен)
При a[i],b[j] = 0, то => i++,j++ (Оба вышеупомянутых условия)
Доходим до крайних i , j.
*/
while ((i < numberOfSuppliers) && (j < numberOfConsumers))
{
try
{
if (a[i] == 0)
{
i++;
}
if (b[j] == 0)
{
j++;
}
if (a[i] == 0 && b[j] == 0)
{
i++;
j++;
}
// Что меньше, - запасы на складе или потребности потребителя?
// Наименьшее значение сохранится в Delivery.
C[i, j].Delivery = Element.FindMin(a[i], b[j]);
// Обновить данные на складе - вычестить из них Delivery.
a[i] -= C[i, j].Delivery;
// Обновить данные по потребителю - вычесть из его потребностей Delivery.
b[j] -= C[i, j].Delivery;
}
catch { }
}
// Вывод на экран массива, демонстрирующего наш путь.
for (i = 0; i < numberOfSuppliers; i++)
{
for (j = 0; j < numberOfConsumers; j++)
{
if (C[i, j].Delivery != 0)
{
Console.ForegroundColor = ConsoleColor.Blue;
Console.Write("{0}", C[i, j].Value);
Console.ForegroundColor = ConsoleColor.Red;
Console.Write("~[{0}]~", C[i, j].Delivery);
Console.ResetColor();
}
else
Console.Write("{0}({1})", C[i, j].Value, C[i, j].Delivery);
}
Console.WriteLine();
}
int ResultExpense = 0;
// Произведём подсчёт наших затрат.
for (i = 0; i < numberOfSuppliers; i++)
{
for (j = 0; j < numberOfConsumers; j++)
{
ResultExpense += (C[i, j].Value * C[i, j].Delivery);
}
}
Console.WriteLine(" Затраты на траспортировку = {0}", ResultExpense);
Console.ReadLine();
}
static void RenderTitle()
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("\t*** *** ***");
Console.ForegroundColor = ConsoleColor.Gray;
}
static int[] GetNumberOfSuppliers(out int numberOfSuppliers)
{
RenderTitle();
Console.WriteLine("Введите количество A-поставщиков:");
Console.ForegroundColor = ConsoleColor.White;
numberOfSuppliers = Convert.ToInt32(Console.ReadLine());
return new int[numberOfSuppliers];
}
static int[] GetNumberOfConsumers(out int numberOfConsumers)
{
RenderTitle();
Console.WriteLine("Введите количество B-поставщиков:");
Console.ForegroundColor = ConsoleColor.White;
numberOfConsumers = Convert.ToInt32(Console.ReadLine());
return new int[numberOfConsumers];
}
static int[] GetVolumeOfSupply(int i, int[] a)
{
RenderTitle();
Console.WriteLine("Объем продукции на складе:");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Введите a[i]");
for (i = 0; i < a.Length; i++)
{
a[i] = Convert.ToInt32(Console.ReadLine());
}
return a;
}
static int[] GetNeedOfConsumption(int j, int[] b)
{
RenderTitle();
Console.WriteLine("Запросы потребителей:");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Введите b[i]");
for (j = 0; j < b.Length; j++)
{
b[j] = Convert.ToInt32(Console.ReadLine());
}
return b;
}
}
}