[Java] class Sudoku...dubbi
ciao a tutti!
studiando per Fondamenti d'Informatica ho trovato questo esercizio scritto dal mio prof.
La classe Sudoku ha il solo metodo di classe seguente:
public static boolean verificaSchema(int[][] schema)
che riceve in ingresso un matrice di interi di dimensione 9×9 e restituisce true se la matrice rappresenta una soluzione valida per il gioco del Sudoku, false altrimenti. Scrivere la classe Sudoku e la classe ProvaSudoku che la testa.
Non riuscendo a capire come potesse essere fatto ho guardato la soluzione:
il mio dubbio sta nel metodo controllaRiga (e per contro anche in controllaColonna e controllaSettore).
In pratica lui costruisce un array booleano
dopodichè scrive
quindi dice che l'elemento dell'array booleano cifre che varia con le colonne dell'array schema passato come parametro è true, giusto?
continua con
cioè al variare di j se l'elemento j-esimo di "cifre" è false allora il booleano "risultato" è false e ritorna "risultato", ok?
quello che mi chiedo è: a seconda di cosa l'elemento j-esimo di "cifre" è false? perchè prima tutti gli elementi di "cifre" erano true, no? perchè ora gli dice che potrebbero essere false? qual'è l'evento che li rende false?
grazie!!
studiando per Fondamenti d'Informatica ho trovato questo esercizio scritto dal mio prof.
La classe Sudoku ha il solo metodo di classe seguente:
public static boolean verificaSchema(int[][] schema)
che riceve in ingresso un matrice di interi di dimensione 9×9 e restituisce true se la matrice rappresenta una soluzione valida per il gioco del Sudoku, false altrimenti. Scrivere la classe Sudoku e la classe ProvaSudoku che la testa.
Non riuscendo a capire come potesse essere fatto ho guardato la soluzione:
class Sudoku{ public static boolean verificaSchema(int[][] schema){ boolean risultato=true; for(int i=0;i<9&&risultato;i++){ if(!controllaRiga(schema,i)) risultato=false; } for(int i=0;i<9&&risultato;i++){ if(!controllaColonna(schema,i)) risultato=false; } for(int i=0;i<9&&risultato;i+=3) for(int j=0;j<9&&risultato;j+=3){ if(!controllaSettore(schema,i,j)) risultato=false; } return risultato; } private static boolean controllaRiga(int[][] schema, int i){ boolean[] cifre=new boolean[9]; for(int j=0;j<9;j++){ cifre[schema[i][j]-1]=true; } boolean risultato=true; for(int j=0;j<9 && risultato;j++){ if(!cifre[j]) risultato=false; } return risultato; } private static boolean controllaColonna(int[][] schema, int i){ boolean[] cifre=new boolean[9]; for(int j=0;j<9;j++){ cifre[schema[j][i]-1]=true; } boolean risultato=true; for(int j=0;j<9 && risultato;j++){ if(!cifre[j]) risultato=false; } return risultato; } private static boolean controllaSettore(int[][] schema, int i0, int j0){ boolean[] cifre=new boolean[9]; for(int i=0;i<3;i++) for(int j=0;j<3;j++){ cifre[schema[i0+i][j0+j]-1]=true; } boolean risultato=true; for(int j=0;j<9 && risultato;j++){ if(!cifre[j]) risultato=false; } return risultato; } }
il mio dubbio sta nel metodo controllaRiga (e per contro anche in controllaColonna e controllaSettore).
In pratica lui costruisce un array booleano
boolean[] cifre=new boolean[9]
dopodichè scrive
for(int j=0;j<9;j++){ cifre[schema[i][j]-1]=true; }
quindi dice che l'elemento dell'array booleano cifre che varia con le colonne dell'array schema passato come parametro è true, giusto?
continua con
boolean risultato=true; for(int j=0;j<9 && risultato;j++){ if(!cifre[j]) risultato=false; } return risultato;
cioè al variare di j se l'elemento j-esimo di "cifre" è false allora il booleano "risultato" è false e ritorna "risultato", ok?
quello che mi chiedo è: a seconda di cosa l'elemento j-esimo di "cifre" è false? perchè prima tutti gli elementi di "cifre" erano true, no? perchè ora gli dice che potrebbero essere false? qual'è l'evento che li rende false?
grazie!!
Risposte
[Ci sono alcuni errori ed altro, ma vabbè... è un esercizio]
Gli elementi di 'cifre' prima del controllo NON erano tutti 'true', quanto viene dichiarato l'array sono pd. tutti 'false'; poi il programma fa un ciclo per la riga (colonna/settore) di nove elementi di 'schema', e "marca" le cifre trovate (mette 'true' nel corrispondente elemento dell'array delle cifre). Infine fa un ciclo di controllo: se (almeno) una manca, lo schema non è corretto e mette risultato a 'false'.
Gli elementi di 'cifre' prima del controllo NON erano tutti 'true', quanto viene dichiarato l'array sono pd. tutti 'false'; poi il programma fa un ciclo per la riga (colonna/settore) di nove elementi di 'schema', e "marca" le cifre trovate (mette 'true' nel corrispondente elemento dell'array delle cifre). Infine fa un ciclo di controllo: se (almeno) una manca, lo schema non è corretto e mette risultato a 'false'.
errori? boh...considera che è la soluzione del prof questa 
ah si certo, all'inizializzazione sono false e poi il primo ciclo for li porta a true.
però aspetta...
il primo ciclo for quindi verifica l'esistenza, al variare delle colonne, delle cifre? Quali, da 0 a 9? E se una cifra non c'è è false e quindi va tutto a monte?

ah si certo, all'inizializzazione sono false e poi il primo ciclo for li porta a true.
però aspetta...
il primo ciclo for quindi verifica l'esistenza, al variare delle colonne, delle cifre? Quali, da 0 a 9? E se una cifra non c'è è false e quindi va tutto a monte?