Как найти убывающий столбец в матрице

package main

import "fmt"


func main() {
    array:=[4][4]int {{2,1,6,5}, {7,6,8,0},{4,6,3,1},{5,6,7,4}}
    b:=0;
    for i:=0;i<4;i++{
        for j:=0;j<5;j++{
            if  array[i+1][j]<array[i][j] {
                b=b+1
            }
        }
    }
    fmt.Println(b)
}

Ответы (1 шт):

Автор решения: CrazyElf
    array:=[4][4]int {{2,1,6,5}, {7,6,8,0},{4,6,3,1},{5,6,7,4}}
           ^^^^^^
    b:=0;
    for i:=0;i<4;i++{
        ^^^^^^^^
        for j:=0;j<5;j++{
            ^^^^^^^^
            if  array[i+1][j]<array[i][j] {
                     ^^^^^^^^
                b=b+1
            }
        }
    }

Размер массива 4x4, но индексация начинается с 0, а значит валидные индексы это 0, 1, 2, 3.

На последней итерации цикла по i у вас будет i = 3, а значит обращение к array[i+1][j] будет по индексу array[3+1][j], выход за пределы массива.

На последней итерации цикла по j у вас будет обращение к array[i+1][4] - снова выход за пределы массива.

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

Что касается сути задачи, то вы, например, можете считать кол-во убывающих элементов во внутреннем цикле, что вы сейчас и делаете. Только b нужно обнулять перед началом внутреннего цикла, а после внутреннего цикла нужно проверять, что b совпадает с числом итераций внутреннего цикла и в этом случае можно увеличивать счётчик убывающих столбцов, для чего вам нужно завести ещё одну отдельную переменную. Можно и по-другому это делать - завести перед внутренним циклом флаг и сбрасывать его, если условие убывания не выполняется хотя бы один раз. После цикла проверять это условие и менять или не менять счётчик уменьшающихся столбцов.

→ Ссылка