Циклический сдвиг столбцов матрицы - C#
Формулировка задачи:
10. Дана матрица А[m,n], выполнить циклический сдвиг всех ее столбцов, начиная со второго, так, чтобы максимальный элемент каждого столбца оказался в той же строке, что и максимальный элемент первого столбца.
если можно с комментариями))
Решение задачи: «Циклический сдвиг столбцов матрицы»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace ConsoleApplication7
- {
- class Program
- {
- static void Main(string[] args)
- {
- const int m = 4, n = 12;
- Random rnd = new Random();
- int[,] A = new int[m, n];
- int[] temp = new int[m]; //временный масив для хранаения одного столбца в процессе сдвига
- List<int> list = new List<int>();
- int r; //использ при инициализ матрицы для хранения random-значений
- int i, j, k;
- int max0, iMax0=-1; //макс. значение и индекс первого столбца
- int max, iMax=-2, jMax=-1; //макс. значения и их индексы неупорядоченой (правой) части матрицы
- bool flag = true;
- //Заполняем матрицу (по столбцам), в пределах одного столбца значения не повторяются
- Console.WriteLine("Рандомная матрица:");
- for (j = 0; j < n; j++)
- {
- for (i = 0; i < m; i++)
- {
- r = rnd.Next(10);
- foreach (int item in list) //сохраняем значения каждого столбца во временный список
- { //во избежание дублирования их в пределах одного столбца
- if (item == r)
- flag = false;
- }
- if (flag)
- {
- A[i, j] = r;
- list.Add(A[i, j]);
- }
- else
- {
- flag = true;
- i--;
- }
- }
- list.Clear();
- }
- //Выводим матрицу на консоль
- for (i = 0; i < m; i++)
- {
- for (j = 0; j < n; j++)
- {
- Console.Write("{0,4}", A[i, j]);
- }
- Console.WriteLine();
- }
- //Находим максимальное для первого (№0) столбца
- max0 = int.MinValue;
- for (i = 0; i < m; i++)
- {
- if (A[i, 0] > max0)
- {
- max0 = A[i, 0];
- iMax0 = i;
- }
- }
- int j2 = 0; //нумератор для перемещенных столбцов
- for (j = 1; j < n; j++)
- {
- //находим max в следующем столбце
- max = int.MinValue;
- for (i = 0; i < m; i++)
- {
- if (A[i,j]>max)
- {
- max = A[i, j];
- iMax = i;
- jMax = j;
- }
- }
- //если индекс максим элем. текущего столбца совпадает с индексом max первого столбца
- if (iMax==iMax0)
- {
- j2++;
- while (jMax>j2)
- {
- for (k = 0; k < m; k++) //используем временный массив temp для обмена значениями
- { //первого и последнего столбцов (из необработанной правой части матрицы)
- temp[k] = (A[k, j2]);
- }
- for (k = j2; k < n-1; k++)
- {
- for (i = 0; i < m; i++)
- {
- A[i, k] = A[i, k+1];
- }
- }
- for (k = 0; k < m; k++) //из временного массива заносим елементы в последний столбец
- {
- A[k, n - 1] = temp[k];
- }
- jMax--;
- }
- j = j2 + 1;
- }
- }
- //Вывод результата в консоль
- Console.WriteLine("Результат:");
- for (i = 0; i < m; i++)
- {
- for (j = 0; j < n; j++)
- {
- Console.Write("{0,4}", A[i, j]);
- }
- Console.WriteLine();
- }
- Console.ReadLine();
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д