Как решить задачу не только для квадратной матрицы
#include <iostream>
#include <ctime>
#include <cstddef>
int main() {
using namespace std;
srand ( time(NULL) );
int **arr;
int col = 3;
int row = 3;
arr = new int* [col];
for (int i = 0; i < row; i ++) {
arr[i] = new int [col];
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
arr[i][j] = ((rand() % 9));
}
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
cout << " " << arr[i][j];
}
cout << endl;
}
/*for (int i = 0; i < col; i ++) {
delete [] arr[i];
}
delete [] arr;*/
// обход матрицы по главной диагонали
int *new_arr = new int [row];
for (int i = 0; i < row; i++) {
for (int j = 0; j < row; j++) {
if (i == j) {
new_arr[i] = arr[i][j];
}
}
}
cout << endl;
for (int i = 0; i < row; i++) {
cout << " " << new_arr[i];
}
//обход матрицы по второстепенной диагонали
/* for (int i = 0; i < row; i++) {
new_arr[i] = arr[i][row-i-1];
cout << " " << new_arr[i];
}*/
}
Необходимо в новый одномерный массив занести значения главной и побочной диагонали. Но работает это только для квадратной, как можно сделать и для прямоугольной?
Ответы (1 шт):
количество диагональных элементов в матрице это min(n, m), поэтому для хранения главной и побочной диагонали создаем массив длиной 2 * min(n, m)
теория из https://ru.wikipedia.org/wiki/Главная_диагональ
Главной диагональю прямоугольной матрицы является диагональ, которая начинается в верхнем левом углу матрицы и изменяется вниз и вправо, пока не будет достигнут правый или нижний край матрицы. Например, у следующих матриц элементы главной диагонали равны единице:
{{1, 0, 0, 0}, {{1, 0, 0},
{0, 1, 0, 0}, {0, 1, 0},
{0, 0, 1, 0}} {0, 0, 1},
{0, 0, 0}}
небольшой набросок реализующий вашу задачу, проверьте работоспособность могут быть ошибки
#include <iostream>
#include <algorithm>
int main()
{
const int n = 2; // количество строк в матрице
const int m = 3; // количество столбцов в матрице
int matrix[n][m] = {
{1, 2, 3},
{4, 5, 6},
};
int min = std::min(n, m);
int size = 2 * min;
int cur = 0;
int* arr = new int[size];
// обход по главной диагонали
for (int i = 0;i < min;++i) {
arr[cur++] = matrix[i][i];
}
// обход по побочной диагонали
for (int i = 0;i < min;++i) {
arr[cur++] = matrix[i][min - i - 1];
}
for (int i = 0;i < size;++i) {
std::cout << arr[i] << ' '; // 1 5 2 4
}
delete[] arr;
return 0;
}