Aiuto con Find the Treasure

Buongiorno a tutti.
Stavo risolvendo il problema Find the Treasure (algobadge), e sono arrivato a questo codice:

#include <stdio.h>
#include <assert.h>
#include<vector>
using namespace std;

int esploraIsola(vector<vector<int>> G, int N, int M, int i, int j, vector<vector<int>>& visited){
    int a=1,b=1,c=1,d=1;
    visited[i][j]=1;
    if(G[i][j]==0){
        return 1;   //bordo trovato
    }
    if(i==0||i==N-1||j==0||j==M-1){
        return 0;
    }
    if(!visited[i][j+1]){
        a=esploraIsola(G,N,M,i,j+1,visited);
    }
    if(!visited[i][j-1]){
        b=esploraIsola(G,N,M,i,j-1,visited);
    }
    if(!visited[i+1][j]){
        c=esploraIsola(G,N,M,i+1,j,visited);
    }
    if(!visited[i-1][j]){
        d=esploraIsola(G,N,M,i-1,j,visited);
    }
    if(a==0||b==0||c==0||d==0){
        return 0;
    }
    return 1;
}

int solve(vector<vector<int>> G, int N, int M){
    vector<vector<int>> visited(N, vector<int>(M, 0));
    int nIsole=0;
    for(int i=0; i<N; i++){
        for(int j=0; j<M; j++){
            if(visited[i][j]==0&&G[i][j]==1){
                nIsole+=esploraIsola(G,N,M,i,j,visited);
            }
        }
    }
    return nIsole;
}

int main() {
    int N,M;
//  uncomment the following lines if you want to read/write from files
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    assert(2 == scanf("%d %d", &N, &M));
    
    vector<vector<int>> G(N, vector<int>(M,0));

    for(int i=0; i<N; i++)
        for (int j=0; j<M; j++)
            assert(1 == scanf("%d", &G[i][j]));



    printf("%d\n", solve(G,N,M)); // print the result
    return 0;
}

Questo programma con gli esempi funziona perfettamente, ma con altri case durante il testing no, portandomi ad una valutazioni di 0/100. Ci sono degli edge case che mi sono perso? Il mio ragionamento è corretto?

Ringrazio in anticipo chiunque aiuti.

Ciao, il problema riguarda le celle visitate e soprattutto la (0,0) che non viene presa in considerazione nel modo in cui le tue celle visitate vengono aggiornate.
Una soluzione sarebbe quella di aggiornare le celle visitate in ogni if() della funzione esplora() in questo modo tutte le celle sono visitate alla stessa maniera.
Tuttavia anche con questo aggiustamento il tuo algoritmo prende 40/100 sulla piattaforma olinfo.it perché va in TLE, mentre su algobadge non so.

Ciao, innanzitutto grazie della risposta. Vorrei chiederti, cosa si intende per “aggiornare” le celle visitate? Cosa ti fa intendere che la cella (0;0) non viene presa in considerazione con le altre?

Ciao, per agiornamento della cella visitata (i,j) si intende settare la variabile visited[i][j] = 1.
E questo è un input in cui il tuo algoritmo restituisce un valore sbagliato:

3 3
1 1 0
1 1 0
0 0 0

Grazie mille! Io ho ottenuto 100/100 però :slight_smile:

Su olinfo.it?

Su algobadge… però da quel che ho capito gli esercizi presenti su algobadge sono linkati a training.olinfo.it