Подсчет количества элементов блоков с одинаковыми последовательными элементами - PullRequest
0 голосов
/ 02 апреля 2019

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

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

Входные данные: целые числа 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 && c == n);
}

int main(){
    int res = 0, i, j, pos_r = 0, pos_c = 0;
    scanf("%d%d%d", &m, &n, &t);
    for(i = 0; i < m; i++)
        for(j = 0; j < n; j++)
            scanf("%d", &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(&pos_r, &pos_c)){
            res++;
            if(pos_c < n - 1) pos_c++;
            else{
                pos_c = 0;
                pos_r++;
            }
        }
    }

    printf("%d", res);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...