Qui una versione più efficiente, ma decisamente più complessa da capire.
Aiuta a capire diverse sfaccettature della logica booleana e del linguaggio.
(soprattutto ci si deve chiedere perchè non funziona più se si inverte il controllo delle righe e delle colonne )
Ho incluso anche un Sudoku di test per fare delle prove...
public class Sudoku {
private static boolean verifica(int[][] mat) {
boolean[] test = new boolean[10];
// Verifica righe
for(int riga=0; riga<mat.length; riga++) {
for(int colonna=0; colonna<mat[riga].length; colonna++) {
if (((riga % 2) == 0) != (test[mat[riga][colonna]-1] = !test[mat[riga][colonna]-1])) return false;
}
}
// Verifica colonne
for(int colonna=0; colonna<mat[0].length; colonna++) {
for(int riga=0; riga<mat.length; riga++) {
if (((colonna % 2) == 0) == (test[mat[riga][colonna]-1] = !test[mat[riga][colonna]-1])) return false;
}
}
return true;
}
public static void main(String[] args) {
int[][] mat = {{4,3,5,2,6,9,7,8,1},
{6,8,2,5,7,1,4,9,3},
{1,9,7,8,3,4,5,6,2},
{8,2,6,1,9,5,3,4,7},
{3,7,4,6,8,2,9,1,5},
{9,5,1,7,4,3,6,2,8},
{5,1,9,3,2,6,8,7,4},
{2,4,8,9,5,7,1,3,6},
{7,6,3,4,1,8,2,5,9}};
if ( verifica(mat) ) {
System.out.println("Sudoku corretto");
} else {
System.out.println("Sudoku NON corretto");
}
}
}