Sudoku


SUBMITTED BY: Guest

DATE: Nov. 17, 2013, 7:37 p.m.

FORMAT: C++

SIZE: 5.8 kB

HITS: 911

  1. // code by Salvatore Cerruto
  2. // this code allow to solve sudoku with recursive approach
  3. /* sudolib.h */
  4. typedef enum{FALSE, TRUE} boolean;
  5. FILE *aggancio_file(char nomefile[]);
  6. int get_matrix(FILE *file, int ***matrice, char nomefile[]);
  7. int genera_soluzione(int **matrice, int N, int riga, int colonna);
  8. void stampa_soluzione(int **matrice, int N);
  9. int controlla_sudoku(int **matrice, int N, int riga, int colonna);
  10. /* sudolib.c */
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <math.h>
  14. #include "sudolib.h"
  15. FILE *aggancio_file(char nomefile[])
  16. {
  17. FILE *file=NULL;
  18. file=fopen(nomefile, "r");
  19. return (file);
  20. }
  21. int get_matrix(FILE *file, int ***matrice, char nomefile[])
  22. {
  23. int temp, item=0, riga, colonna;
  24. while(fscanf(file, "%d", &temp)!=EOF)
  25. item++;
  26. fclose(file);
  27. file=aggancio_file(nomefile);
  28. if(file!=NULL)
  29. {
  30. /** allocazione righe **/
  31. *matrice=(int **) malloc(sqrt(item)*sizeof(int *));
  32. for(riga=0; riga<sqrt(item); riga++)
  33. {
  34. /** allocazione colonne e scansione file **/
  35. (*matrice)[riga]=(int *) malloc(sqrt(item)*sizeof(int));
  36. for(colonna=0; colonna<sqrt(item); colonna++)
  37. fscanf(file, "%d", &(*matrice)[riga][colonna]);
  38. }
  39. }
  40. /** restituisco la dimensione della matrice **/
  41. return (sqrt(item));
  42. }
  43. int controlla_sudoku(int **matrice, int N, int riga, int colonna)
  44. {
  45. /** is e js sono gli indici usati per evidenziare le sottomatrici **/
  46. int i, j, is, js, k=floor(sqrt(N));
  47. /** controllo che non ci siano elementi uguali sulla colonna **/
  48. for(i=0; i<N; i++)
  49. if((matrice[i][colonna]==matrice[riga][colonna])&&(i!=riga))
  50. return 0;
  51. /** controllo che non ci siano elementi uguali sulla riga **/
  52. for(j=0; j<N; j++)
  53. if((matrice[riga][j]==matrice[riga][colonna])&&(j!=colonna))
  54. return 0;
  55. /** controllo della sottomatrice corrente **/
  56. is=(riga/k)*k;
  57. js=(colonna/k)*k;
  58. for(i=is; i<is+k; i++)
  59. for(j=js; j<js+k; j++)
  60. {
  61. if((matrice[i][j]==matrice[riga][colonna])&&(i!=riga||j!=colonna))
  62. return 0;
  63. }
  64. return 1;
  65. }
  66. int genera_soluzione(int **matrice, int N, int riga, int colonna)
  67. {
  68. int k;
  69. if(riga>=N)
  70. return 1;
  71. /* se la casella è già presente deve saltarla */
  72. if(matrice[riga][colonna]!=0)
  73. {
  74. if(colonna==N-1)
  75. return genera_soluzione(matrice, N, riga+1, 0);
  76. else
  77. return genera_soluzione(matrice, N, riga, colonna+1);
  78. }
  79. for(k=1; k<=N; k++)
  80. {
  81. matrice[riga][colonna]=k;
  82. /**system("cls");
  83. stampa_soluzione(matrice, N);**/
  84. if(controlla_sudoku(matrice, N, riga, colonna))
  85. {
  86. if(colonna==N-1)
  87. {
  88. if(genera_soluzione(matrice, N, riga+1, 0))
  89. return 1;
  90. }
  91. else
  92. {
  93. if(genera_soluzione(matrice, N, riga, colonna+1))
  94. return 1;
  95. }
  96. }
  97. matrice[riga][colonna]=0;
  98. }
  99. return 0;
  100. }
  101. void stampa_soluzione(int **matrice, int N)
  102. {
  103. int i, j, k, cont_c=0, cont_r=0;
  104. printf("+");
  105. for(i=0; i<2*N+sqrt(N)-1; i++)
  106. printf("-");
  107. printf("+");
  108. for(i=0; i<N; i++)
  109. {
  110. printf("\n|");
  111. for(j=0; j<N; j++)
  112. {
  113. printf("%d ", matrice[i][j]);
  114. cont_c++;
  115. if(cont_c==sqrt(N)&&i!=N)
  116. {
  117. printf("|");
  118. cont_c=0;
  119. }
  120. }
  121. cont_r++;
  122. if(cont_r==sqrt(N))
  123. {
  124. printf("\n+");
  125. for(k=0; k<2*N+sqrt(N)-1; k++)
  126. printf("-");
  127. printf("+");
  128. cont_r=0;
  129. }
  130. }
  131. printf("\n");
  132. return;
  133. }
  134. /* main.c */
  135. #include <stdio.h>
  136. #include <stdlib.h>
  137. #include "sudolib.h"
  138. #define MAX 20
  139. int main()
  140. {
  141. int **matrice, N;
  142. char nomefile[MAX];
  143. FILE *filein;
  144. printf("***** Sudoku *****\n");
  145. printf("Inserire il nome del file schema: ");
  146. scanf("%s", nomefile);
  147. filein=aggancio_file(nomefile);
  148. if(filein!=NULL)
  149. {
  150. N=get_matrix(filein, &matrice, nomefile);
  151. if(genera_soluzione(matrice, N, 0, 0))
  152. {
  153. printf("\n***** Soluzione *****\n");
  154. stampa_soluzione(matrice, N);
  155. }
  156. else
  157. printf("\nSoluzione impossibile");
  158. }
  159. return 0;
  160. }
  161. /* example file */
  162. 6 0 0 0 0 0 4 3 0
  163. 0 0 0 0 7 0 5 1 0
  164. 0 0 0 3 0 4 0 0 9
  165. 0 0 3 0 0 8 9 0 0
  166. 0 2 0 0 0 0 0 8 0
  167. 0 0 8 5 0 0 2 0 0
  168. 2 0 0 4 0 7 0 0 0
  169. 0 1 4 0 6 0 0 0 0
  170. 0 6 9 0 0 0 0 0 7

comments powered by Disqus