Тема: Вставки, удаления, перестановки в массивах - C#
Формулировка задачи:
Путем перестановки элементов квадратной вещественной матрицы добиться того, чтобы ее максимальный элемент находился в левом верхнем углу, следующий по величине – в позиции (2,2), следующий по величине – в позиции (3,3) и т.д., заполнив таким образом всю главную диагональ.
(если не сложно, напишите комментарии с пояснениями, спасибо)
Решение задачи: «Тема: Вставки, удаления, перестановки в массивах»
textual
Листинг программы
static void Main(string[] args)
{
//Напечатать все последовательности длины k из чисел 1..n
Console.WriteLine("Введите размер матрицы: ");
int n = int.Parse(Console.ReadLine());
int[,] arr = new int[n, n];
Random rnd = new Random();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
arr[i, j] = rnd.Next(0, 100);
Console.Write(arr[i, j] + " ");
}
Console.WriteLine();
}
int maxValue=0;
int ch =-1;
int ch2 = -1;
int[] maxArr = new int[n];
for (int i = 0; i < n; i++)
{
maxValue = arr.Cast<int>().Max(); // максимальный элемент матрицы
ch = (int)Char.GetNumericValue(finder(arr, maxValue)[0]); // первый индекс максимального элемента
ch2 = (int)Char.GetNumericValue(finder(arr, maxValue)[1]); // второй индекс максимального лемента
maxArr[i] = arr[ch, ch2]; // новый одномерный массив из максимальных элементов
arr[ch, ch2] = 0; // для "упрощения" заменяем места где когда-то были максимлаьные элементы на нули
}
int l = 0;
for (int i = 0; i < n; i++) // цикл для того что бы заменить нулевые элементами на элементы стоящие на диагонали
{
for (int j = 0; j < n; j++)
{
if (arr[i, j] == 0)
{
arr[i, j] = arr[l, l]; //arr[l,l] и есть элементы главной матрицы
l++;
}
}
}
int m = 0;
for (int i = 0; i < n; i++) // цикл для заполнения главной диагонали максимальными элементами
{
arr[m, m] = maxArr[i]; // arr[m, m] есть нечто иное как элемент находящийся на главной диагонали
m++;
}
Console.WriteLine("Новая матрица: ");
for (int i = 0; i < n; i++) // вывод новго массива на экран
{
for (int j = 0; j < n; j++)
{
Console.Write(arr[i, j] + " ");
}
Console.WriteLine();
}
Console.ReadKey();
}
static public string finder(int[,] arr,int maxValue) // этот метод будет нам возвращать индексы максимального элемента
{
int indexI = 0;
int indexJ = 0;
double n = Math.Sqrt(arr.Length);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (arr[i, j] == maxValue)
{
indexI = i; indexJ = j;
}
}
}
return string.Format("{0}{1}",indexI,indexJ);
}