Find the treasure (islands) 85/100

ciao a tutti, purtroppo non riesco a superare l’ultimo subtask e non ne capisco il motivo. allego il codice:

#include <stdio.h>
#include <assert.h>

#define MAXN 1000

using namespace std;

int R, C;
long long res = 0;
int M[MAXN][MAXN];

int check(int i, int j){
    M[i][j]=2;
    int a = 1, b = 1, c = 1, d = 1;
    if(M[i-1][j] == 1){
        if(i-1 == 0)
            return 0;
        a = check(i-1,j);
    }
    if(M[i][j+1] == 1){
        if(j+1 == C-1) 
            return 0;
        b = check(i,j+1);
    }
    if(M[i+1][j] == 1){
        if(i+1 == R-1) 
            return 0;
        c = check(i+1,j); 
    }
    if(M[i][j-1] == 1){
        if(j-1 == 0) 
            return 0;
        d = check(i,j-1);
    }
    return a && b && c && d;
}

int main() {
    int i, j;
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    assert(2 == scanf("%d %d", &R, &C));
    for(i=0; i<R; i++)
        for (j=0; j<C; j++)
            assert(1 == scanf("%d", &M[i][j]));

    for(i = 1; i < R-1; i++)
        for(j = 1; j < C-1; j++)
            if(M[i][j] == 1)
                if(check(i, j) && M[i-1][j] != 2 && M[i][j-1] != 2)
                    res++;

    printf("%lld\n", res);
    return 0;
}
1 Mi Piace

Invece di

metti

ed analogamente almeno per b e c. Se trovi un 1 di bordo devi comunque estendere la penisola a tutte le celle di valore 1 connesse e quindi vedere se bisogna chiamare la check per le altre direzioni, altrimenti rischi di considerare, in seguito, come isole delle parti di penisole.

Grazie mille, ora funziona perfettamente. avevo già provato a fare una cosa del genere ma ricordo che non mi funzionava, probabilmente non lo avevo scritto correttamente.

1 Mi Piace