Подсчет количества элементов блоков с одинаковыми последовательными элементами

#c #arrays

#c #массивы

Вопрос:

У меня следующая проблема:

Парк, имеющий форму доски размером m x n. Существует k видов деревьев (1 <= k <= 100). Парк разделен на m x n ячеек, и в каждой ячейке они посадят дерево. Теперь на карте внутри каждой ячейки парка есть целое число i, если в ней посажено дерево i-го типа, или 0, если в ней нет дерева. Строка ячеек считается «хорошей», если в ней есть по крайней мере t деревьев одинаковых типов (и они должны находиться в одной строке или столбце). Подсчитайте количество деревьев, которых нет в «хорошей» строке.

Входные данные: Целые числа m, n, t и массив целых чисел m x n представляют карту.

Вывод: количество деревьев, которых нет в «хорошей» строке.

Пример:

Ввод: 5 6 3

1 3 3 3 3 4

1 2 3 2 0 4

3 2 2 2 4 4

1 0 0 2 4 0

1 2 3 0 4 4

Результат: 10

Объяснение: Жирными цифрами выделены деревья, которые не расположены в правильной строке.

1 3 3 3 3 4

1 2 3 2 0 4

3 2 2 2 4 4

1 0 0 2 4 0

1 2 3 0 4 4

Моя идея состоит в том, чтобы проверить наличие каждого элемента в массиве. Если оно удовлетворено, я перейду к ближайшему элементу за пределами «хорошей» строки. В противном случае он просто перейдет к следующему элементу в той же строке, или, если строка заканчивается, то к следующему элементу в столбце.

Вот мой код

 #include <stdio.h>

#define maxn 120

int a[maxn][maxn], m, n, t;

int check(int *i, int *j){
    int k, cnt_r, cnt_c;
    cnt_r = 0;
    //jump to the nearest cell that is not in good line
    for(k = *i   1; k < m; k  ){
        if(a[*i][*j] == a[k][*j]) cnt_r  ;
        if(cnt_r >= t){
            *i = k;
            return 1;
        }
    }
    cnt_c = 0;
    for(k = *j   1; k < n; k  ){
        if(a[*i][*j] == a[*i][k]) cnt_c  ;
        if(cnt_c >= t){
            *j = k;
            return 1;
        }
    }
    return 0;
}
//check if this is the last square or not
int lastSq(int r, int c){
    return (r == n - 1 amp;amp; c == n);
}

int main(){
    int res = 0, i, j, pos_r = 0, pos_c = 0;
    scanf("%d%d%d", amp;m, amp;n, amp;t);
    for(i = 0; i < m; i  )
        for(j = 0; j < n; j  )
            scanf("%d", amp;a[i][j]);

    while(!lastSq(pos_r, pos_c)){
        if(a[pos_r][pos_c] == 0){
            if(pos_c < n - 1) pos_c  ;
            else if(pos_r < n - 1){
                pos_c = 0;
                pos_r  ;
            }
        }
        if(!check(amp;pos_r, amp;pos_c)){
            res  ;
            if(pos_c < n - 1) pos_c  ;
            else{
                pos_c = 0;
                pos_r  ;
            }
        }
    }

    printf("%d", res);
}
  

Но он не выводит никаких выходных данных. Единственное, что у меня есть, это 0xC0000005. Может кто-нибудь, пожалуйста, проверить, где я допустил ошибку, и указать мне направление? Спасибо.

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

1. Слишком много звездочек! Вам не нужно постоянно обновлять указанные целые числа

2. Какое значение t ?

3. «Строка ячеек считается «хорошей», если в ней есть по крайней мере t деревьев одинаковых типов (и они должны находиться в одной строке или столбце)» Значение t предназначено для определения того, подходит строка или нет. В нашем примере t = 3.

4. Как вы узнаете, scanf("%d%d%d", amp;m, amp;n, amp;t); удастся ли? (и scanf("%d", amp;a[i][j]); ?)

5. Слово «последовательный» не появляется в назначении, но появляется в вашем названии, это может означать, что вы искажаете или неправильно понимаете проблему. Пожалуйста, опубликуйте свое задание дословно.