grazie per l'aiuto
ho provato una soluzione simile alla tua, ma non funziona bene, sempre meglio della prima

Il percorso però deve andare dalla casella [0][0] a [n][n] cioè dalla prima casella in alto a sinistra all'ultima in alto a destra.

ho scritto questa funz, ma

codice:
int percorri(int M[8][8], int nr, int nc, int r, int c){
    
    somma=somma+M[r][c];
    if(somma==250 && r==8 && c==8){
        printf("%d", M[r][c]);
        return 1;
    }
    else if(somma < 250){
        if(c<7)
            if(percorri(M,nr,nc,r,c+1)==1){
                printf("casella %d, somma %d\n", M[r][c], somma);
                return 1;
            }else{
                  somma=somma-M[r][c+1];
            }
        if(r<7)
            if(percorri(M,nr,nc,r+1,c)==1){
                printf("casella %d, somma %d\n", M[r][c], somma);
                return 1;
            }else{
                  somma=somma-M[r+1][c];
            }
        if(c>0)
            if(percorri(M,nr,nc,r,c-1)==1){
                printf("casella %d, somma %d\n", M[r][c], somma);
                return 1;
            }else{
                  somma=somma-M[r][c-1];
            }
        if(r>0)
            if(percorri(M,nr,nc,r-1,c)==1){
                printf("casella %d, somma %d\n", M[r][c], somma);
                return 1;                               
            }else{
                  somma=somma-M[r-1][c];
            }
    }  
}
non so se sbaglio la posizioni dei controlli..
la mia mente ha difficoltà a ragionare ricorsivamente la ricorsione.