Originariamente inviato da Alfredo_88
Come potrei fare altrimenti?
Di soluzioni, come spesso succede, ce ne sarebbero svariate. Una te l'ha detta Andrea1979, cioè quella di usare dei boolean per verificare le occorrenze dei numeri 1..9.
Ma anche volendo usare i cicli innestati si può fare, essendo (immagino) un esercizio "didattico" non credo proprio sia necessario "spremere" a livello di performance.

Il punto è che se vuoi usare l'approccio dei cicli annidati, dovresti farlo in modo appropriato.
Cioè un ciclo esterno per le righe e un altro esterno per le colonne. Dentro il ciclo principale ci dovrebbero stare 2 ulteriori cicli annidati. Però gli indici in questi due cicli vanno gestiti in modo oculato. Il primo numero devi verificare che non si trovi nelle 8 celle successive, il secondo numero devi verificare che non si trovi nelle 7 celle successive, ecc..
Insomma, l'indice più interno parte dal <indice del numero> + 1.

E non è questo che succede nei tuoi primi codici che hai postato, visto che k lo inizializzi solo una volta fuori dal ciclo esterno e va sempre solo avanti.