Как решить задачу не только для квадратной матрицы

#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 шт):

Автор решения: Ildar

количество диагональных элементов в матрице это 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;
}
→ Ссылка