计算具有相同连续元素的块的元素数

时间:2019-04-02 02:51:38

标签: c arrays

我遇到以下问题:

具有m x n木板形式的公园。有k种树(1 <= k <= 100)。公园分为m x n个单元,每个单元将种植一棵树。现在,在地图上,如果公园中种植了第i种树,则公园的每个单元内都将有一个整数i;如果其中没有种植任何树,则其内部将为一个整数i。如果一行至少有t棵相同类型的树(并且它们必须在同一行或同一列上),则该行被视为“良好”。计算不在“好”行中的树的数量。

输入:整数m,n,t和m×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。有人可以检查我在哪里犯了错误并提供指示吗?谢谢。

0 个答案:

没有答案