Поменять местами элементы строк матрицы - C#
Формулировка задачи:
Добрый день! Подскажите, кто знает, допустим вводим в консоль матрицу типа
1 2 1
6 4 3
7 7 1
как переставить элементы строк матрицы так, чтобы сумма столбцов была примерно одинакова
1 1 2
6 4 7
3 7 1
Заранее спасибо
Решение задачи: «Поменять местами элементы строк матрицы»
textual
Листинг программы
static void Main()
{
int[,] A =
{
{1, 2, 1},
{6, 4, 3},
{7, 7, 1}
};
//A.Dump();
Optimize(A);
//A.Dump();
}
static void Optimize(int[,] matrix)
{
int[] sums = InitializeColumnSums(matrix);
while (Improve(matrix, sums, sums.Min(), sums.Max())) ;
}
static bool Improve(int[,] matrix, int[] sums, int min, int max)
{
if (min == max)
return false;
for (int y1 = 0; y1 < matrix.GetLength(0); y1++)
for (int x1 = 0; x1 < matrix.GetLength(1); x1++)
{
if (sums[x1] != min && sums[x1] != max)
continue;
for (int x2 = 0; x2 < matrix.GetLength(1); x2++)
{
for (int y2 = 0; y2 < matrix.GetLength(0); y2++)
{
if (matrix[y1, x1] == matrix[y2, x2])
continue;
int sum1 = sums[x1] - matrix[y1, x1] + matrix[y2, x2];
int sum2 = sums[x2] - matrix[y2, x2] + matrix[y1, x1];
if (sum1 > min && sum1 < max && sum2 > min && sum2 < max)
{
Swap(ref matrix[y1, x1], ref matrix[y2, x2]);
sums[x1] = sum1;
sums[x2] = sum2;
return true;
}
}
}
}
return false;
}
static void Swap<T>(ref T a, ref T b)
{
var t = a;
a = b;
b = t;
}
static int[] InitializeColumnSums(int[,] matrix)
{
var sums = new int[matrix.GetLength(1)];
for (int y = 0; y < matrix.GetLength(0); y++)
for (int x = 0; x < matrix.GetLength(1); x++)
sums[x] += matrix[y, x];
return sums;
}