При обработке матрицы код С++, находя в каждой ее строке, выписывает не строку с минимальным количеством, а просто первую строку

Мне нужно написать код с инструкцией: Напишите программу, которая находит в матрице строку с минимальной суммой. Если таких строк несколько, найдите первую такую ​​строку. Мой код:

#include <iostream>
using namespace std;
int main() {
    int n, m, h;
    int arr[100][100];
    cin >> n >> m;
    const int q=m;
    int ar[q];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> arr[i][j];
        }
        
    }
    for (int i = 0; i<n; i++){
        int sum = 0;
        for (int j = 0; j<m; j++){
            sum += arr[i][j];
        }
        for (int y=0; y<q; y++){
            ar[y] = sum;
        }
    }
    int sammin = ar[0];
    for (int i = 0; i<q; i++){
        if (ar[i] < sammin){
            h = i;
        }
    }
    for (int j = 0; j<m;j++){
        cout << arr[h][j] << " ";
    }
    return 0;
}

С входными данными:

4 5

1 3 2 54 234

75 12 3 46 9

13 26 56 9 12

14 90 897 6 34

Код записывает первую строку, когда он должен вывести строку с индексом 2.

Каков ожидаемый результат для этого набора данных? Я бы посоветовал вам прекратить использовать однобуквенные переменные для всего. Если то, что они представляют, может иметь осмысленное имя, используйте его, чтобы вы и другие могли прочитать ваш код и понять, что он должен делать.

Retired Ninja 25.04.2024 20:40

Примечание в int ar[q];q недостаточно постоянно. Из-за const int q=m;q нельзя изменить по сравнению со значением m, но m можно установить на любое значение, которое соответствует intat среде выполнения. q должно быть известно во время компиляции, чтобы соответствовать стандарту.

user4581301 25.04.2024 20:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для начала такие массивы переменной длины:

const int q=m;
int ar[q];

не являются стандартной функцией C++. Вместо этого вам следует использовать стандартный контейнер std::vector<int>.

В вашей матрице n строк. Таким образом, массив ar должен содержать элементы n вместо m.

Этот внутренний цикл for:

for (int y=0; y<q; y++){
    ar[y] = sum;
}

заполняет все элементы массива ar одним и тем же значением sum на каждой итерации внешнего цикла. Вместо внутреннего цикла for вам нужно просто написать:

arr[i] = sum;

Поскольку массив благодаря внутреннему циклу содержит все элементы, равные сумме элементов последней строки матрицы, а сумма максимальна для введенной матрицы, то переменная h внутри этого цикла не изменяется:

int sammin = ar[0];
for (int i = 0; i<q; i++){
    if (ar[i] < sammin){
        h = i;
    }
}

и остается равным 0.

Чтобы найти суммы строк, вы можете использовать стандартный алгоритм std::accumulate, объявленный в заголовке <numeric>. Чтобы найти строку с минимальной суммой, вы можете использовать стандартный алгоритм std::min_element, объявленный в заголовке <algorithm>.

Вот минимальная демонстрационная программа:

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <numeric>

int main()
{
    size_t n, m;

    std::cin >> n >> m;

    std::vector<std::vector<int>> matrix( n, std::vector<int>( m ) );

    for (auto &row : matrix)
    {
        for (auto &item : row)
        {
            std::cin >> item;
        }
    }

    std::vector<long long int> ar( n );

    for (size_t i = 0; const auto &row : matrix)
    {
        ar[i++] = std::accumulate( std::begin( row ), std::end( row ), 0ll );
    }

    auto it = std::min_element( std::begin( ar ), std::end( ar ) );

    auto pos = std::distance( std::begin( ar ), it );

    for (const auto &item : matrix[pos] )
    {
        std::cout << item << ' ';
    }
    std::cout << '\n';
}

Другие вопросы по теме