Blog Stats
  • Posts - 3
  • Articles - 0
  • Comments - 157
  • Trackbacks - 1

 

Post #1 - La ricorsione ed il gioco del Sudoku.

Post #1 - La ricorsione ed il gioco del Sudoku.

Day:30 agosto 2005

 

Scorrendo il codice scritto da Francesco Balena sul blog in dotnet2themax riguardante il famigerato Sudoku, mi è venuta la curiosità di provare a cercare un metodo che facesse uso della ricorsione per trovare le soluzioni del gioco.

 

Semplice ed elegante.

 

Il gioco come forse saprete, si svolge su una tavola di 9 x 9 celle da riempire con un numero compreso tra 1 e 9 (è possibile riferirsi a nove diversi simboli, ma i numeri offrono una comprensione più immediata), in base ad una semplice regola d'esclusione: per ciascuna riga, colonna o riquadro (9 sotto tavole 3 x 3 ) ciascun valore compare una sola volta (vedi l'articolo di Piergiorgio Odifreddi su "Le Scienze" di Agosto 2005 pag. 109 per notizie sostanziose sul gioco).

 

In una data cella, applicando la regola base, si escludono tra i nove possibili valori quelli già presenti nella corrispondente riga, colonna o riquadro, ottenendo le uniche possibili alternative.

Inserendo questi valori nella cella dello schema uno per volta, si hanno altrettanti schemi figli che possono portare a soluzioni.

Ripetendo l'operazione di determinazione delle altenative e d'inserimento dei valori possibili nelle celle, si costruisce un albero di schemi le cui foglie o sono soluzioni, o sono schemi incoerenti (uno schema è incoerente se vi sono violazioni alla regola base).

 

Questo metodo per tentativi e verifiche è anche il più banale, ma permette di sperimentare la ricorsione ed i costrutti del linguaggio.

 

Veniamo al codice.

 

La struttura del codice è organizzata in due classi, la prima ( Board ) rappresenta lo schema del gioco ed espone i metodi base per determinare le alternative dei valori nelle celle e verificare la coerenza dello schema.

La seconda classe ( Sudoku ) rappresenta il gioco con il metodo ricorsivo di soluzione che quindi esplora un albero di possibili schemi.

Tale metodo procede in questo modo:

1 – riempire le celle dello schema che hanno un'unica alternativa tra i nove valori ( FillOnes )

2 – verificare se lo schema è ancora coerente ( IsCoherence )

3 – verificare se lo schema è soluzione ( IsSolution )

4 – altrimenti inserire in una cella i valori possibili e ricominciare dal punto 1

 

Il linguaggio scelto per la scrittura del codice è C#. Molti nomi che si trovano nel listato di Francesco Balena sono stati mantenuti, come pure l'utilizzo di array monodimensionali per non decrementare le performance, ed il valore zero per rappresentare una cella vuota, mentre alcuni campi sono stati invece eliminati ( GroupInfo ). Ringrazio Francesco Balena e tutti quelli che vorranno segnalare errori o dar seguito ad ulteriori sviluppi.

 

Ecco la funzione ricorsiva di soluzione (sotto licenza GPL):

 

      private void SolveR( Board PlayGame , int PosCell , int CellValue )

      {

            if( CellValue != 0 ){

                  PlayGame.SetCell( PosCell , CellValue );

                  PlayGame.UpdatePossibility( PosCell );

            }

           

            PlayGame.FillOnes();

           

            if( !(PlayGame.IsCoherence() ) ){

                  return;

            }

           

            if(  PlayGame.IsSolution()  ){

                  PlayGame.Print();

                  return;

            }

           

            int PosMinCell = PlayGame.MinPossibilityCell();

            bool[] Key = PlayGame.PossibilityValues( PosMinCell );

 

            for(int Value = 0 ; Value < 9; ++Value)

                  if( Key[ Value ] ){

                  Board Game1 = new Board( PlayGame );

                  SolveR( Game1 , PosMinCell , Value + 1 );

            }

      }

  

Prossimamente pubblicherò il listato completo con qualche modifica: a presto... bye, è ora di una vacanza!

  powered by IMHO 1.2


Feedback

# re: Post #1 - La ricorsione ed il gioco del Sudoku.

Gravatar Mha io ho provato il nuovo exe ma non risolve molto visto che a continuamente errori di memoria e pensare che questo sodoku l'hanno preparato dei bimbi d 8.9 anni in un scuola elementare..
qua sotto il il file file da caricare:

..7..AF..D3...8....E4D..CA..623..92D3.......C.G...3..7.EG2.....BA.....4..B...CE.D.4B...5.EC.7....F...31C.4......E6.179.....2..A59D..F.....AB8.C2......9.28E...B....8.12.4...AF.G.1B...8..C.....43.....7D8.B..6...5.7.......9GB1..GD2..B1..74F....C...G5..3D..A..

fammi sapere maxx 25/09/2005 01:31 | problemi con memoria

# re: Post #1 - La ricorsione ed il gioco del Sudoku.

Gravatar This is a good article I think.上海翻译公司汇集了各研究领域成果突出且有爱心的专家/教授/博士以及具备良好海外文化背景的留学人员,打造了一支涵盖多学科领域的精英翻译团队。上海翻译公司致力于学术翻译领域,成就于高端翻译板块。通过毕业论文、发表论文、学术资料、教学案例翻译,以及申请留学文书、图书出版翻译和其他学术范围内的资料翻译服务,帮助朋友们第一时间吸收国际先进成果,第一时间把您的学术科研成果展示给世界。上海翻译公司提供英语翻译、日语翻译、德语翻译、法语翻译、俄语翻译、韩语翻译等50多个语种。除了提供笔译、口译外还有同传设备租赁服务。翻译公司还提供其他的行业翻译服务如经济翻译、法律翻译、建筑翻译、图书翻译…… 03/01/2008 10:51 | kimi

# re: Post #1 - La ricorsione ed il gioco del Sudoku.

Gravatar and momentous characters watch series are thrown into the thin skin or coating far too long delayed, 07/11/2014 22:10 | watch series

Comments have been closed on this topic.
 

 

Copyright © Roberto Giacomelli