#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....