Загрузка данных


Ниже обе задачи решены на C++17. Предполагается, что в первой задаче нужно получить отдельное количество нулей для каждого нечётного столбца. Нечётные столбцы нумеруются с 1.

Во второй задаче считаем, что заштрихованы левый и правый треугольники между диагоналями матрицы, а сами диагонали в области не входят.

#include <iostream>
#include <vector>
#include <utility>
#include <limits>
#include <stdexcept>

using namespace std;

// Задача 1.
// Возвращает количества нулей в каждом нечётном столбце.
// Нечётные столбцы: 1, 3, 5, ...
vector<int> countZerosInOddColumns(const vector<vector<int>>& matrix) {
    int n = matrix.size();
    vector<int> counts;

    // В C++ индексация начинается с 0:
    // столбцы 0, 2, 4, ... — это столбцы 1, 3, 5, ... при нумерации с 1.
    for (int j = 0; j < n; j += 2) {
        int zeroCount = 0;

        for (int i = 0; i < n; ++i) {
            if (matrix[i][j] == 0) {
                ++zeroCount;
            }
        }

        counts.push_back(zeroCount);
    }

    return counts;
}

// Задача 2.
// Возвращает минимум в левом треугольнике и максимум в правом.
pair<int, int> findMinLeftAndMaxRight(
    const vector<vector<int>>& matrix
) {
    int n = matrix.size();

    int minLeft = numeric_limits<int>::max();
    int maxRight = numeric_limits<int>::min();

    bool leftRegionHasElements = false;
    bool rightRegionHasElements = false;

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            // Левый треугольник:
            // ниже главной диагонали и выше побочной.
            if (i > j && i + j < n - 1) {
                if (matrix[i][j] < minLeft) {
                    minLeft = matrix[i][j];
                }
                leftRegionHasElements = true;
            }

            // Правый треугольник:
            // выше главной диагонали и ниже побочной.
            if (i < j && i + j > n - 1) {
                if (matrix[i][j] > maxRight) {
                    maxRight = matrix[i][j];
                }
                rightRegionHasElements = true;
            }
        }
    }

    if (!leftRegionHasElements || !rightRegionHasElements) {
        throw invalid_argument(
            "Для этих областей матрица должна иметь размер не меньше 3x3."
        );
    }

    return {minLeft, maxRight};
}

int main() {
    int n;
    cout << "Введите размер матрицы N: ";
    cin >> n;

    if (n <= 0) {
        cout << "Размер матрицы должен быть положительным.\n";
        return 1;
    }

    vector<vector<int>> matrix(n, vector<int>(n));

    cout << "Введите элементы матрицы " << n << "x" << n << ":\n";
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cin >> matrix[i][j];
        }
    }

    // Задача 1
    vector<int> zeroCounts = countZerosInOddColumns(matrix);

    cout << "\nКоличество нулей в нечётных столбцах:\n";
    for (int count : zeroCounts) {
        cout << count << ' ';
    }
    cout << '\n';

    // Задача 2
    try {
        auto [minLeft, maxRight] = findMinLeftAndMaxRight(matrix);

        cout << "\nМинимум в левой заштрихованной области: "
             << minLeft << '\n';
        cout << "Максимум в правой заштрихованной области: "
             << maxRight << '\n';
    } catch (const invalid_argument& error) {
        cout << '\n' << error.what() << '\n';
    }

    return 0;
}


▎Пояснение к первой задаче

В C++ нумерация столбцов начинается с нуля. Поэтому нечётным столбцам с обычной нумерацией — 1, 3, 5, … — соответствуют индексы 0, 2, 4, ....

Цикл

for (int j = 0; j < n; j += 2)


перебирает именно эти столбцы. Для каждого из них программа проходит по всем строкам, считает нули и добавляет результат в вектор.

Например, если в матрице 5 столбцов, функция вернёт три числа: количество нулей в столбцах 1, 3 и 5.

▎Пояснение ко второй задаче

Для элемента матрицы с индексами i (строка) и j (столбец):

• главная диагональ задаётся условием i == j;
• побочная диагональ — условием i + j == n - 1.