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;
}
Комментарии
Роман Максимов
/* Выполнить преобразование матрицы, а именно - перестановку строк и столбцов. Для квадратной матрицы размером N переставляйте столбцы и строки таким образом, чтобы элементы матрицы с наибольшим значением, по модулю, располагался в нижнем правом углу матрицы. Заполнение исходной матрицы организовать с клавиатуры. */ //--------------------------------------------------------------------------- #include <iostream> #include <iomanip> //--------------------------------------------------------------------------- using namespace std; //--------------------------------------------------------------------------- int main() { int column, // меняемый столбец row, // меняемая строка n, // размер матрицы max(0), // максимальный элемент матрицы по модулю val(0), // значение матрицы которое переставляем в нижний правый угол **matrix; // матрица cout << "Enter the size of the square matrix: "; cin >> n; try { matrix = new int*[n]; for (int i = 0; i < n; i++) matrix[i] = new int[n]; } catch (bad_alloc) { cout << "Unable to allocate memory." << endl; system("pause"); return 1; } srand(time(NULL)); cout << "Source matrix:" << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { matrix[i][j] = rand() % 199 - 99; // диапазон значений [-99 ... 99] cout << setw(3) << matrix[i][j] << " "; if (max < abs(matrix[i][j])) { max = abs(matrix[i][j]); val = matrix[i][j]; row = i; column = j; } } cout << endl; } cout << "The maximum element of the matrix modulo: " << val << endl << endl; // меняем местами строки for (int j = 0; j < n; j++) swap(matrix[row][j], matrix[n - 1][j]); // меняем местами столбцы for (int i = 0; i < n; i++) swap(matrix[i][column], matrix[i][n - 1]); cout << "Resulting matrix:" << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) cout << setw(3) << matrix[i][j] << " "; cout << endl; } for (int i = 0; i < n; i++) delete [] matrix[i]; delete [] matrix; system("pause"); return 0; } //---------------------------------------------------------------------------Shini_chi
#include <iostream> #include <cstdlib> #include <ctime> #include <iomanip> using namespace std; int main () { setlocale (LC_ALL, "rus"); srand(time(NULL)); int num, row, column; cout << "Размер массива: "; cin >> num; int **ptrArray = new int *[num]; for (int i = 0; i < num; i++) ptrArray[i] = new int [num]; for (int i_row = 0; i_row < num; i_row++) { for (int i_column = 0; i_column < num; i_column++) { ptrArray[i_row][i_column] = rand()%100 + 1; cout << setw(3) << ptrArray[i_row][i_column]; } cout << endl; } int max = ptrArray [0][0]; for (int i_row = 0; i_row < num; i_row++) for (int i_column = 0; i_column < num; i_column++) if (max < ptrArray[i_row][i_column]) { max = ptrArray[i_row][i_column]; row = i_row; column = i_column; } int *ptrTemp = new int [num]; for (int i_row = 0; i_row < num; i_row++) ptrTemp[i_row] = ptrArray [i_row][num-1]; for (int i_row = 0; i_row < num; i_row++) ptrArray[i_row][num-1] = ptrArray[i_row][column]; for (int i_row = 0; i_row < num; i_row++) ptrArray[i_row][column] = ptrTemp[i_row]; for (int i_column = 0; i_column < num; i_column++) ptrTemp[i_column] = ptrArray[num-1][i_column]; for (int i_column = 0; i_column < num; i_column++) ptrArray[num-1][i_column] = ptrArray[row][i_column]; for (int i_column = 0; i_column < num; i_column++) ptrArray[row][i_column] = ptrTemp[i_column]; cout << "\nПосле преобразований\n"; for (int i_row = 0; i_row < num; i_row++) { for (int i_column = 0; i_column < num; i_column++) { cout << setw(3) << ptrArray[i_row][i_column]; } cout << endl; } delete [] ptrTemp; for (int i = 0; i < num; i++) delete [] ptrArray[i]; }Anufree
#include <iostream> #include <vector> #include <ctime> using namespace std; void Input(vector<vector<int>>&, int); void Menu(vector<vector<int>>&, int); void Line(vector<vector<int>>&, int); void Column(vector<vector<int>>&, int); void Print(vector<vector<int>>&, int); int main() { setlocale(LC_ALL, "Russian"); int n = 0; cout << "\n\t\t\tВведите размер квадратной матрици: "; cin >> n; vector<vector<int>> v(n, vector<int> (n)); Input(v, n); Menu(v, n); return 0; } void Input(vector<vector<int>> &v, int n) { srand(time(0)); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { v[i][j] = rand() % 10; } } Print(v, n); } void Menu(vector<vector<int>> &v, int n) { int i = 0; cout << "\t\t\tВыберите действие:" << endl; do { cout << "\t\t\t1. Поменять местами строкм матрици" << endl; cout << "\t\t\t2. Поменять местами столбци матрици" << endl; cout << "\t\t\t3. Выход" << endl; cout << "\t\t\t"; cin >> i; if (i == 1) { Line(v, n); return; } if (i == 2) { Column(v, n); return; } } while (i != 3); } void Line(vector<vector<int>> &v, int n) { int a = 0, b = 0; cout << "\t\t\tУкажите какие строки поменять местами" << endl; cout << "\t\t\tСтрока A = "; cin >> a; cout << "\t\t\tСтрока B = "; cin >> b; for (int i = 0; i < n; ++i) { swap(v[a - 1][i], v[b - 1][i]); } Print(v, n); Menu(v, n); } void Column(vector<vector<int>> &v, int n) { int a = 0, b = 0; cout << "\t\t\tУкажите какие столбци поменять местами" << endl; cout << "\t\t\tСтолбец A = "; cin >> a; cout << "\t\t\tСтолбец B = "; cin >> b; for (int i = 0; i < n; ++i) { swap(v[i][a - 1], v[i][b - 1]); } Print(v, n); Menu(v, n); } void Print(vector<vector<int>> &v, int n) { for (int i = 0; i < n; ++i) { cout << "\t\t\t\t"; for (int j = 0; j < n; ++j) { cout << (v[i][j]) << ' '; } cout << endl; } }Arthur
#include<iostream> #include<ctime> #include <cstdlib> #include <iomanip> using namespace std; const int MAX_SIZE = 20; void showMass(int** , int, int); int main() { setlocale(LC_CTYPE, "rus"); int sz; while(true) { cout<<"Введите размер массива: "; cin >> sz; if(cin.good() && sz>0 && sz <= MAX_SIZE) { cin.ignore(100, '\n'); break; } cin.clear(); cout<<"Неправильный ввод данных\n\n"; cin.ignore(100, '\n'); } int** mass = new int*[sz]; for(int x = 0; x<sz; x++) mass[x] = new int[sz]; cout<<"Исходный массив:"; srand(time(0)); for (int i = 0; i < sz; i++) for (int j = 0; j < sz; j++) mass[i][j] = rand() % 50; showMass(mass, sz, sz); int maxx = 0; int str = 0; int col = 0; for(int x = 0; x<sz; x++) for(int y = 0; y<sz; y++) if(mass[x][y] > maxx) { maxx = mass[x][y]; str = x; col = y; } cout<<"\n\n"<<"Максимальное значение: "<<maxx<<"\n" <<"строка = "<<str<<"\n" <<"столбец = "<<col<<endl; cout<<"\nПерестановка строк: \n"; swap(mass[str], mass[sz-1]); showMass(mass, sz, sz); cout<<"\n\nПерестановка столбцов: \n"; for(int x = 0; x<sz; x++) swap(mass[x][col], mass[x][sz-1]); showMass(mass, sz, sz); return 0; } ////////////////////////////////////////////////////////////// void showMass(int**arr , int m, int n) { for (int i = 0; i < m; i++) { cout<<"\n\n"; for (int j = 0; j < n; j++) cout <<setw(4)<< arr[i][j] ; } }