Newsgroup: it.comp.lang.perl
Titolo: Pacioccando con gli array.

Buongiorno a tutti,
sono un povero programmatore che vuole imparare il Perl per diletto, 
possibilmente per lavoro e, in alternativa, per conquistare il mondo.
Sto tentando di fare un algoritmo per generare griglie del sudoku valide 
(con cui si possa trovare almeno una soluzione). Lo so che esiste già un
modulo su CPAN per generare e risolvere i Sudoku, ma prima di 
utilizzarlo volevo scriverlo da me (in fondo "there is more than one way 
to do it" ;-)).
Ho pensato prendiamo un array di array inizializzato così:
for (my $i = 0; $i < 9; $i++) {
	for (my $j = 0; $j < 9; $j++) {
		for (my $k = 0; $k < 9; $k++) {
			$cube[$i][$j][$k] = $k + 1;
		}
	}
}
è il "cubo" che contiene tutti possibili modi in cui si possono 
combinare i numeri da uno a nove in una matrice 9x9.
A questo punto scelgo uno dei numeri da uno a nove e lo colloco in un 
punto casuale della matrice (che conterrà a questo punto un array di un
solo elemento). Fatta questa operazione elimino quel numero estratto 
dagli altri vettori nella stessa riga, nella stessa colonna e nella 
stessa regione della cella della matrice che ha solo più un elemento (è 
più o meno chiaro?). L'operazione che utilizzo per "rimontare" l'array è 
all'incirca questa:
@{$cube[$i][$j]} = (@{$cube[$i][$j]}[0..($pos - 1)], 
@{$cube[$i][$j]}[($pos + 1)..$ubound]);
dove $i e $j sono gli indici di riga e colonna e $pos è la posizione 
dell'elemento da rimuovere dall'array. Le istruzioni sono un po' diverse 
per rimuovere il primo e l'ultimo elemento.
Purtroppo alla fine della procedura nella griglia definitiva mi trovo 
dei numeri che violano la regola del sudoku, ovvero trovo numeri 
identici sulla stessa riga, colonna e regione.
A guardare i primi passi del processo col debugger, sembra andare tutto 
bene (gli array vengono ridotti nel modo in cui mi aspetto). Mi viene il 
sospetto che ci sia qualcosa che non so sul comportamento degli array.
Voi che ne pensate?
Simone

 ha scritto nel messaggio 
news:4502c7f3$0$13718$5fc...@news.tiscali.it...


 risolvere il sudoku.
Accidenti io non ero ancora arrivato fino a questo punto ;-)
Il problema credo che sia a monte, nel senso che in teoria con il mio
metodo non dovresti poter avere due numeri identici sulla stessa riga,
come invece accade. Insomma, se io vado a selezionare un numero a caso
dalla lista dei numeri che possono stare in una cella (che all'inizio
sono quelli da 1 a 9)  e poi lo elimino dalla lista dei valori
possibili per le altre celle sulla stessa riga, colonna e riquadro, in
teoria non posso ritrovarmi due numeri uguali (ovviamente il tutto va
iterato n volte).
La mia perplessità quindi non era tanto sulla bontà del metodo di
generazione, quanto sulle possibili motivazioni tecniche che mi portano
ad avere due numeri uguali in posizioni illegali. Alla fine o quel
numero non viene tolto, o viene riscritto. Forse però a questo punto
avrebbe più senso postare una porzione di listato più consistente.
Comunque credo di avere capito il motivo per cui il mio metodo potrebbe
non trovare una soluzione. Alla fine potrebbe trovarsi con un insieme
di possibili numeri senza possibilità di sceglierne uno piuttosto che
un altro... insomma non sarebbe affatto un risolutore.
Grazie mille
Simone