Ho fatto come mi dici:
mi sono scritto 3 metodi private: uno che testa ogni singola riga, uno per le colonne e l'atro i settori 3x3.
codice:
//VERIFICA RIGA
private static boolean controllaRiga(int[][] schema, int i){
boolean[] flags = new boolean[9];
for(int j=0; j<9; j++){
flags[schema[i][j]-1]=true;
}
boolean result=true;
for(int j=0; j<9; j++){
if(!flags[j])
result=false;
}
return result;
}
//VERIFICA COLONNA
private static boolean controllaColonna(int[][] schema, int j){
boolean[] flags = new boolean[9];
for(int i=0; i<9; i++)
flags[schema[i][j]-1]=true;
boolean result=true;
for(int i=0; i<9; i++){
if(!flags[i])
result=false;
}
return result;
}
//VERIFICA SETTORE
private static boolean controllaSettore(int[][]schema, int h){
boolean[] flags = new boolean[9];
int i0 = (h/3)*3;
int j0 = (h%3)*3;
for(int i=j0; i<i0+3; i++){
for(int j=j0; j<j0+3; j++){
flags[schema[i][j]-1]=true;
}
}
boolean result=true;
for(int k=0; k<9; k++){
if(!flags[k])
result=false;
}
return result;
}
Infine ho scritto il metodo public(di istanza) che sfruttando i 3 metodi sopra mi restituisce un boolean true o false a seconda che lo schema sia corretto o meno:
codice:
//VERIFICA SCHEMA
public static boolean verificaSchema(int[][] schema){
boolean corretto=true;
int i=0;
while(i<9 && corretto){
if(!controllaRiga(schema,i))
corretto=false;
i++;
}
if(corretto){
int k=0;
while(k<9 && corretto){
if(!controllaColonna(schema,k))
corretto=false;
k++;
}
}
if(corretto){
int j=0;
while(j<9 && corretto){
if(!controllaSettore(schema, j))
corretto=false;
j++;
}
}
return corretto;
}
Ho testato il codice (realizzando una classe di prova e mettendo un array 9x9) ma a quanto pare non funziona e secondo me il problema stà nel metodo public (verificaSchema() per intenderci). Potrei fare 3 cicli for, uno per le righe, uno per le colonne e l'altro per i settori. Però credo (almeno) che sia più efficiente se il metodo verificaSchema() si stoppasse nel momento in cui già una condizione non sia verificata. Per esempio se già riscontro una riga sbagliata è inutile che mi metta a controllare le colonne e i settori.
Come potrei fare?