Найдите сумму всех положительных элементов матрицы, расположенных перед самым большим положительным элементом

#c

Вопрос:

вот что я пробовал раньше:

 //finding maximum
    for (int i = 0; i < n;   i)
    {
        for (int j = 0; j < n;   j)
        {
            if (arr[i][j] > max)
            {
                max = arr[i][j];
                imax = i;
                jmax = j;
            }
        }
    }
//finding a sum
    for (int i = 0; i < n;   i)
    {
        for (int j = 0; j < n;   j)
        {
            if (arr[i][j] > 0)
            {
                if (i <= imax amp;amp; j < jmax)
                    sum  = arr[i][j];
            }
        }
    }

    cout << "sum = " << sum << endl;
}
 

но этот алгоритм не учитывает это правильно, как я должен сделать, чтобы он работал?
похоже, что мой код «ограничивает» диапазон поиска из-за неправильного состояния, и я не знаю, как это исправить?

Комментарии:

1. что означает «расположенный раньше» ? Похоже, это проблема в вашем коде

Ответ №1:

Давайте подумаем шаг за шагом.

Предполагая, imax что это номер строки и jmax номер столбца максимального количества элементов, присутствующих в матрице.

Процедура выбора строки:

Итак, чтобы достичь нашей цели, мы пройдем row через то, что есть <= imax . Это означает, что мы будем рассматривать значение текущей строки как наш ответ только в том случае, если current row <= imax . Если текущая строка становится больше , чем row , то мы можем прекратить обход .

 //finding a sum
for (int i = 0; i < n;   i)
{
    for (int j = 0; j < n;   j)
    {
        if (arr[i][j] > 0)
        {
            if(i <= imax)
            {
                // do something
            }
            else
            {
                break;
            }
        }
    }
}
 

Мы также можем сделать это следующим образом:

 //finding a sum
for (int i = 0; i < n amp;amp; i <= imax;   i)
{
    for (int j = 0; j < n;   j)
    {
        if (arr[i][j] > 0)
        {
        }
    }
}
 

Процедура выбора столбца:

Это немного отличается от процедуры выбора строки.

Мы можем рассмотреть каждый столбец, если текущая строка не равна imax . Это означает, когда current row < imax мы будем рассматривать значения каждого столбца, но когда current row == imax мы будем рассматривать только значение меньшего столбца в качестве нашего ответа.

 //finding a sum
for (int i = 0; i < n amp;amp; i <= imax;   i)
{
    for (int j = 0; j < n;   j)
    {
        if(i < imax amp;amp; arr[i][j] > 0)
        {
            // consider the value for answer
        }
        else
        {
            // here i == imax
            // so we'll only consider smaller column's value as our answer
            if(j < jmax amp;amp; arr[i][j] > 0)
            {
                // consider the value for answer
            }
            else if(j >= jmax)  // we've come out of the boundary. No matter the value is positive or negative, we don't need to check any further
            {
                break;
            }
        }
    }
}
 

Общий код нахождения части суммы будет выглядеть следующим образом:

 //finding a sum
for (int i = 0; i < n amp;amp; i <= imax;   i)
{
    for (int j = 0; j < n;   j)
    {
        if(i < imax amp;amp; arr[i][j] > 0)
        {
            // consider the value for answer
            sum  = arr[i][j];
        }
        else
        {
            // here i == imax
            // so we'll only consider smaller column's value as our answer
            if(j < jmax amp;amp; arr[i][j] > 0)
            {
                // consider the value for answer
                sum  = arr[i][j];
            }
            else if(j >= jmax)  // we've come out of the boundary. No matter the value is positive or negative, we don't need to check any further
            {
                break;
            }
        }
    }
}
 

Примечание: Не забудьте правильно инициализировать значение max , imax , jmax и. sum

Ответ №2:

Так что это работает не так, как вы это настроили.

Предположим, у вас есть такая матрица:

 0  1  5  10 8
4  22 8  18 11
1  2  6  14 9
1  27 6  14 9
1  2  6  14 9
 

Ваш макс обнаружит, что imax = 3, jmax = 1

Что происходит, когда вы пытаетесь сосчитать элемент в [0, 5]? Вы пропускаете это, потому что jmax = 1 означает, что все элементы справа от столбца j =1 не соответствуют вашим условиям.

Комментарии:

1. итак, как я должен переписать код, чтобы включить все неправильно отброшенные элементы?

Ответ №3:

Неясно, что вы имеете в виду под «находилось раньше», но я почти уверен, что это проблема в вашем коде. Предполагается, что максимальный элемент x , то вы добавляете все элементы, отмеченные, o и исключаете элементы, отмеченные . :

 ooo...
ooo...
oox...
......
......
 

Но я бы предпочел ожидать либо этого

 oooooo
oooooo
oox...
......
......
 

или это:

 ooo...
ooo...
oox...
oo....
oo....