C++

Перестановка строк и столбцов

Выполнить преобразование матрицы, а именно — перестановку строк и столбцов. Для квадратной матрицы размером n переставляйте столбцы и строки таким образом, чтобы элемент матрицы с наибольшим значением, по модулю, располагался в нижнем правом углу матрицы. Заполнение исходной матрицы организовать с клавиатуры.
В этом задании приходится манипулировать только строками и столбцами двумерного массива. Заметьте, матрица квадратная, а значит количество строк и столбцов должно быть одинаково, с помощью функции abs находим модуль значения.

Например,
4 8 9 1
3 0 1 1 - это исходная матрица.
9 8 1 2
5 5 5 5

9 — наибольшее значение по модулю, находится в первой строке и в третьем столбце. Необходимо этот элемент переместить в правый нижний угол, но мы имеем право переставлять только строки и столбцы. Отдельно элемент перемещать нельзя.
Первая итерация:
5 5 5 5
3 0 1 1 - поменяли первую и последнюю строку местами.
9 8 1 2
4 8 9 1

Вторая итерация:
5 5 5 5
3 0 1 1 - поменяли последний и предпоследний столбец местами.
9 8 2 1
4 8 1 9

И теперь элемент со значением 9 стоит в правом нижнем углу. Задача решена.

Ниже приведен код для этой задачи. Код самый простой и может усовершенствоваться (например разбиение его на несколько отдельных функций). Код прислал пользователь нашего сайта — Василий Шуверов. Огромное ему спасибо. Пользуйтесь на здоровье.
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
 
int main()
{
 
     int n,i,j, max, rij [100], kolom[100], k=0, q, x=0,y=0, hulp_1=0, hulp_2=0;
     int ** a, f=0, p,o, itteratie=1, d=0;
 
     /*запрос размера матрицы и выделение под нее памяти*/
 
     printf("specify the size of an array: ");
     scanf("%d", &n);
     printf("\n");
     a=calloc(n,sizeof(int));
 
     for (i=0;i<n;++i)
     {
         a[i]=calloc(n,sizeof(int));
 
     }
 
     /*заполнение матрицы случайными числами от 0 до 10 и одновременный вывод ее на экран*/
 
     for (i=0;i<n;++i)
     {
         for (j=0;j<n;++j)
         {a[i][j]=rand()%10;
         printf("%-2d", a[i][j]);}
         printf("\n");
     }
 
     /*отыскание наибольшего элемента матрицы */
 
     max=a[0][0];
 
     for (i=0;i<n;++i)
     {
         for (j=0;j<n;++j)
         {
             if (a[i][j]>max)
             {
                 max=a[i][j];
             }
         }
     }
 
    /*Нахождение позиций наибольшего элемента (когда их несколько и они одинаковы) */
 
     for (i=0;i<n;++i)
     {
         for (j=0;j<n;++j)
         {
             if (a[i][j]==max)
             {
 
                 rij[k]=++i;
                 kolom[k]=++j;
                 ++k;
 
             --i;
             --j;
             }
         }
     }
 
     /*Когда наибольший элемент встречается несколько раз происходит
     отыскание координат того который уже стоит как могно ближе к правому
     нижнему углу, тем самым минимализируется число перестановок столбцов или строк*/
    q=2;
 
    for (i=0;i<k;++i)
    {
 
       if( (rij[i]+kolom[i])>q )
       {
           q=rij[i]+kolom[i];
           x=rij[i];
           y=kolom[i];
 
       }
 
    }
 
    /*перестановка столбцов если это необходимо  */
while(f<=n)
{
 
    for (i=0;i<n;++i)
     {
         for (j=0;j<n;++j)
         {
           if (j==y)
 
           {
               hulp_1=a[i][--j];
               a[i][j]=a[i][++j];
               a[i][j]=hulp_1;
              d=1;
 
           }
 
         }
     }
if (d)
{
     printf ("\nIteration- %d\n", itteratie++);
               for (o=0;o<n;++o)
           {
               for (p=0;p<n;++p)
               {
                   printf("%-2d", a[o][p]);
               }
               printf("\n");
           }
           d=0;
}
 
     ++y;
   ++f;
}
f=0;
 
/*перестановка строк  если это необходимо*/
while(f<=n)
{
 
    for (i=0;i<n;++i)
     {
         for (j=0;j<n;++j)
         {
           if (i==x)
 
           {
               hulp_2=a[--i][j];
               a[i][j]=a[++i][j];
               a[i][j]=hulp_2;
               d=1;
 
           }
 
         }
 
     }
 
     if (d)
{
     printf ("\nIteration- %d\n", itteratie++);
               for (o=0;o<n;++o)
           {
               for (p=0;p<n;++p)
               {
                   printf("%-2d", a[o][p]);
               }
               printf("\n");
           }
           d=0;
}
 
     ++x;
   ++f;
}
 
    return 0;
}
Теги:
строки, столбцы
Добавлено: 11 Апреля 2018 09:38:17 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...