Загрузка данных
Ниже обе задачи решены на 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.