Переставляя строки и столбцы матрицы, добиться того, чтобы наибольший элемент оказался в левом верхнем углу - C# (197940)
Формулировка задачи:
Дана вещественная матрица размером (N*M). Переставляя её строки и столбцы добиться того что бы наибольший элемент оказался в левом верхнем углу.
Решение задачи: «Переставляя строки и столбцы матрицы, добиться того, чтобы наибольший элемент оказался в левом верхнем углу»
textual
Листинг программы
static void Main(string[] args)
{
//задаем размерность матрицы:
const int n = 5;
const int m = 5;
int[,] matrix = new int[n, m];
Random rand = new Random();
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
matrix[i, j] = rand.Next(0, 20);//заполняем массив случайными числами
Console.WriteLine();
//выводим на консоль полученную матрицу
Print(matrix);
//сортируем матрицу таким образом, чтобы максимальный элемент оказался первым
matrix = Sort(matrix);
//отображаем полученную матрицу
Print(matrix);
Console.WriteLine();
}
static int[,] Sort(int[,] matrix)
{
//получаем размерность матрицы (в данном случае 5 и 5)
int n = matrix.GetLength(0), m = matrix.GetLength(1);
//задаем два промежуточных массива
int[] summ = new int[n];
int[] count = new int[n];
//ищем макс. элемент
for (int i = 0; i < n; i++)
{
int max = matrix[i, 0];
for (int j = 1; j < m; j++)
{
if (matrix[i, j] > max)
max = matrix[i, j];
}
//заносим максимум каждой строки в массив summ
summ[i] = max;
//заносим в count номер строки
count[i] = i;
}
Console.WriteLine();
//создаем новый промежуточный массив
int[,] result = new int[n, m];
//используем стандартную сортировку для перетасовки массива count в нужном порядке
Array.Sort(summ, count);
//переварачиваем массив
Array.Reverse(count);
//выполняем сортировку строк так, чтобы в первой строке оказался первый
//элемент
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
result[i, j] = matrix[count[i], j];
Console.WriteLine();
//выводим промежуточный результат
Print(result);
//продлываем тоже самое, но для сортировки столбцов.
int[] count1 = new int[m];
for (int i = 0; i < m; i++)
{
summ[i] = result[0, i];
count1[i] = i;
}
Console.WriteLine();
Array.Sort(summ, count1);
Array.Reverse(count1);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
matrix[i, j] = result[i, count1[j]];
return matrix;
}
//функция для вывода массива на консоль
static void Print(int[,] matrix)
{
for (int i = 0; i <= matrix.GetUpperBound(0); i++)
{
for (int j = 0; j <= matrix.GetUpperBound(1); j++)
{
Console.Write(matrix[i, j] + "\t");
}
Console.WriteLine();
}
Console.WriteLine();
}
}