нужно сделать из массива ромб

надо сделать из квадратной матрицы ромб. если более точно то развернуть квадрат (массив) на 45 градусов вправо. должно выглядеть это так: Исходный массив:

1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 

Массив в виде ромба:

           1 
         1   2 
       1   2   3 
     1   2   3   4 
   1   2   3   4   5 
     2   3   4   5 
       3   4   5 
         4   5 
           5 

мой код:

    #include <iostream>
    #include <vector>
    #include <iomanip>

    void printDiamond(const std::vector<std::vector<int>>& matrix) {
        int n = matrix.size();

        // Верхняя часть ромба
        for (int i = 0; i < n; ++i) {
            // Печатаем пробелы
            std::cout << std::string(2 * (n - i - 1), ' ');

            // Печатаем элементы
            for (int j = 0; j <= i; ++j) {
                std::cout << std::setw(3) << matrix[i][j]; 
            }
            std::cout << std::endl;
        }

        // Нижняя часть ромба
        for (int i = 1; i < n; ++i) {
            // Печатаем пробелы
            std::cout << std::string(2 * (i - 1), ' '); 

            // Печатаем элементы
            for (int j = i; j < n; ++j) {
                std::cout << std::setw(3) << matrix[j][i]; 
            }

            std::cout << std::endl;
        }
    }

    int main() {
        int n;

        // Ввод размера массива
        std::cout << "Введите размер массива (n x n): ";
        std::cin >> n;

        // Проверка на положительное значение
        if (n <= 0 || n > 10) { // Ограничим размер массива до 10
            std::cout << "Размер массива должен быть положительным и 
    не больше 10." << std::endl;
            return 1;
        }

        // Инициализация массива
        std::vector<std::vector<int>> matrix(n, std::vector<int>(n));

        // Ввод значений массива
        std::cout << "Введите значения массива:" << std::endl;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                std::cin >> matrix[i][j];
            }
        }

        // Вывод исходного массива
        std::cout << "\nИсходный массив:" << std::endl;
        for (const auto& row : matrix) {
            for (int num : row) {
                std::cout << num << " ";
            }
            std::cout << std::endl;
        }

        // Вывод ромба
        std::cout << "\nРомб:" << std::endl;
        printDiamond(matrix);

        return 0;
    }

моя программа делает только верхнюю часть ромба правильно. помогите найти ощибку


Ответы (1 шт):

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

У вас и верхняя часть неправильно строится, только вы этого, вероятно, не заметили из-за выбранных значений

  void printDiamond(const std::vector<std::vector<int>>& matrix) {
        int n = matrix.size();

        // Верхняя часть ромба
        for (int i = 0; i < n; ++i) {
            // Печатаем пробелы
            std::cout << std::string(2 * (n - i - 1), '  ');

            // Печатаем элементы
            for (int j = 0; j <= i; ++j) {
                std::cout << std::setw(4) << matrix[i-j][j]; 
            }
            std::cout << std::endl;
        }

        // Нижняя часть ромба
        for (int i = 1; i < n; ++i) {
            // Печатаем пробелы
            std::cout << std::string(2 + 2 * (i - 1), '  '); 

            // Печатаем элементы
            for (int j = 0; j < n - i; ++j) {
                std::cout << std::setw(4) << matrix[n-j-1][i+j]; 
            }

            std::cout << std::endl;
        }
    }

    int main() {
        int n = 5;   //6;
 
        // Инициализация массива
        std::vector<std::vector<int>> matrix(n, std::vector<int>(n));

        // Ввод значений массива
        //std::cout << "Введите значения массива:" << std::endl;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                //std::cin >> matrix[i][j];
                matrix[i][j] = 10+10*i+ 1 + j;
            }
        }

Пара результатов (онлайн чек):

          11
        21  12
      31  22  13
    41  32  23  14
  51  42  33  24  15
    52  43  34  25
      53  44  35
        54  45
          55

            11
          21  12
        31  22  13
      41  32  23  14
    51  42  33  24  15
  61  52  43  34  25  16
    62  53  44  35  26
      63  54  45  36
        64  55  46
          65  56
            66
→ Ссылка