[Java] class Sudoku...dubbi

alex170
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:

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
Rggb1
[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'.

alex170
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?

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.