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; }
Комментарии
Роман Максимов
Shini_chi
Anufree
Arthur