Выполнить преобразование матрицы, а именно — перестановку строк и столбцов. Для квадратной матрицы размером 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;
}