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.Originariamente inviato da Alfredo_88
Come potrei fare altrimenti?
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.