Guest User

Untitled

a guest
Apr 23rd, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.96 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "sudoku.h"
  5.  
  6. void sudoku_setnumberofconstraints(sudoku *sdku, int x, int y, int num);
  7. void sudoku_addconstraint(sudoku *sdku, int x, int y, int num);
  8. int sudoku_hassolution(sudoku *sdku, int x, int y);
  9. int sudoku_getsolution(sudoku *sdku, int x, int y);
  10. void sudoku_setsolution(sudoku *sdku, int x, int y, int solution);
  11. int sudoku_deducesolution(sudoku *sdku, int x, int y, int *psolution);
  12.  
  13. sudoku *opensudokufile(char *filename) {
  14. sudoku *sdku = NULL;
  15. FILE *file;
  16. char buffer[256];
  17. int gridsize = 9, blocksize = 3; // default values
  18. int num_min = 1, num_max = 9; // default values
  19.  
  20.  
  21. if (!(file = fopen(filename, "r"))) {
  22. perror("failed to open sudoku");
  23. exit(1);
  24. }
  25.  
  26. while (fgets(buffer, sizeof(buffer) - 1, file)) {
  27. char *key = strtok(buffer, ":,; \t\r\n");
  28. if (key == NULL) continue;
  29.  
  30. if (!strcmp(key, "grid")) {
  31. gridsize = atoi(strtok(NULL, ":,; \t\r\n"));
  32. blocksize = atoi(strtok(NULL, ":,; \t\r\n"));
  33. } else if (!strcmp(key, "range")) {
  34. num_min = atoi(strtok(NULL, ":,; \t\r\n"));
  35. num_max = atoi(strtok(NULL, ":,; \t\r\n"));
  36. } else if (!strcmp(key, "set")) {
  37. int x, y, num;
  38.  
  39. x = strtol(strtok(NULL, ":,; \t\r\n"), NULL, 0);
  40. y = strtol(strtok(NULL, ":,; \t\r\n"), NULL, 0);
  41. num = strtol(strtok(NULL, ":,; \t\r\n"), NULL, 0);
  42.  
  43. if (sdku == NULL) {
  44. sdku = sudoku_create(gridsize, blocksize, num_min, num_max);
  45. }
  46. sudoku_setsolution(sdku, x-1, y-1, num);
  47. }
  48. }
  49.  
  50. fclose(file);
  51. return sdku;
  52. }
  53.  
  54. void sudoku_print(sudoku *sdku) {
  55. int x, y;
  56. for (x = 0; x < sdku->gridsize; x++) {
  57. if (x % sdku->blocksize == 0) printf("\n");
  58. for (y = 0; y < sdku->gridsize; y++) {
  59. if (y % sdku->blocksize == 0) printf(" ");
  60. if (sudoku_hassolution(sdku, x, y)) {
  61. printf("%.1X ", sudoku_getsolution(sdku, x, y));
  62. } else {
  63. printf(". ");
  64. }
  65. }
  66. printf("\n");
  67. }
  68. }
  69.  
  70. sudoku *sudoku_create(int gridsize, int blocksize, int num_min, int num_max) {
  71. sudoku* s1; //s1 is een pointer naar een sudoku struct
  72. (*s1).(*constraints) = (int*) malloc(gridsize * sizeof(int)); //alloceer 9 rijen geheugen
  73. (*s1).(**constraints) = (int*) malloc(gridsize * sizeof(int)); //alloceer 9 kolommen geheugen
  74. (*s1).fields = (struct*) malloc(gridsize * gridsize * 3 * sizeof(int)); //alloceer 81 field structuren
  75. return s1;
  76.  
  77. }
  78.  
  79.  
  80. void sudoku_delete(sudoku **psdku) {
  81. // ??????
  82. // waarom is die fucking sudoku nu een dubbele pointer???
  83. }
  84.  
  85.  
  86. int sudoku_setnumberofconstraints(sudoku *sdku, int x, int y, int num) {
  87. ((*sdku).fields[(*sdku).gridsize * x + y]).numconstraints = num; //verander het aantal numconstraints van element (x,y)
  88. ((*sdku).(*constraints[x][y])) = (int*) realloc(num * sizeof(int)); //reserveer geheugen voor de rij constraints van element (x,y)
  89.  
  90. //??????????????? wat moet ik hier returnen ????????
  91. }
  92.  
  93.  
  94. void sudoku_addconstraint(sudoku *sdku, int x, int y, int num) {
  95. (*sdku).(constraints[x][y][((*sdku).fields[(*sdku).gridsize * x + y]).numconstraints-1] = num; //voeg num toe aan de rij op plaats (x,y). We zoeken daarvoor eerst op hoeveel elementen er in die rij zitten (finja, hoeveel geheugen er gereserveerd is in de functie hierboven). -1 want rijen tellen vanaf 0.
  96. // !!! We zullen dus altijd eerst setnumberofconstraints moeten uitvoeren (allocatie) VOOR we addconstraint uitvoeren !!!
  97. }
  98.  
  99.  
  100. int sudoku_hassolution(sudoku *sdku, int x, int y) {
  101. return ((*sdku).fields[(*sdku).gridsize * x + y]).hassolution;
  102. }
  103.  
  104.  
  105. int sudoku_getsolution(sudoku *sdku, int x, int y) {
  106. return ((*sdku).fields[(*sdku).gridsize * x + y]).solution;
  107. }
  108.  
  109.  
  110. void sudoku_setsolution(sudoku *sdku, int x, int y, int solution) {
  111. int i;
  112. int j;
  113. int rij_ondergrens = (x / (*sdku).blocksize) * (*sdku).blocksize;
  114. int rij_bovengrens = rij_ondergrens + blocksize;
  115. int kolom_ondergrens = (y / (*sdku).blocksize) * (*sdku).blocksize;
  116. int kolom_bovengrens = kolom_ondergrens + blocksize;
  117.  
  118. //pas de constraints aan van de overeenkomstige rij
  119.  
  120. for(i=0; i<(*sdku).gridsize; i++) {
  121.  
  122. if(i != y) {
  123.  
  124. sudoku_setnumberofconstraints(*sdku, x, i, (((*sdku).fields[(*sdku).gridsize * x + i]).numconstraints)+1)); //aantal numconstraints dat er al was +1
  125. sudoku_addconstraint(*sdku, x, i, solution);
  126. }
  127. else {
  128. sudoku_setnumberofconstraints(*sdku, x, i, 0); //op de plaats waar je de oplossing vond, mag je het aantal constraints op 0 zetten, en moet je niet langer geheugen reserveren.
  129. ((*sdku).fields[(*sdku).gridsize * x + y]).solution = solution; //vul de oplossing in
  130. ((*sdku).fields[(*sdku).gridsize * x + y]).hassolution = 1;
  131. }
  132. }
  133.  
  134. //pas de constraints aan van de overeenkomstige kolom
  135.  
  136. for(j=0; j<(*sdku).gridsize; j++) {
  137.  
  138. if(j != x) {
  139.  
  140. sudoku_setnumberofconstraints(*sdku, j, y, (((*sdku).fields[(*sdku).gridsize * j + y]).numconstraints)+1));
  141. sudoku_addconstraint(*sdku, j, y, solution);
  142. }
  143. //geen else, je hebt het "oplossingsvakje" al aangepast
  144. }
  145.  
  146. //pas de constraints aan van het overeenkomstige blokje
  147.  
  148. for(i=rij_ondergrens; i<rij_bovengrens+1; i++) {
  149. for(j=kolom_ondergrens; j<kolom_bovengrens; j++) {
  150. while((j != y) && (i != x) { //de elementen op de rij en kolom van (x,y) zijn al aangepast!
  151. sudoku_setnumberofconstraints(*sdku, i, j, (((*sdku).fields[(*sdku).gridsize * x + i]).numconstraints)+1));
  152. sudoku_addconstraint(*sdku, i, j, solution);
  153. }
  154. }
  155. }
  156. }
  157.  
  158.  
  159. int sudoku_deducesolution(sudoku *sdku, int x, int y, int *psolution) {
  160. int i;
  161. int sum=0;
  162. if(((*sdku).fields[(*sdku).gridsize * x + y]).numconstraints) == 8) { //als er 8 elementen zijn die het niet kunnen zijn, dan weet je wat het wel is.
  163. for(i=1; i<9; i++) {
  164. sum += (*sdku).constraints[x][y][i]; //tel alle elementen uit uw rij constraints samen
  165. switch(45-sum) {
  166. case 1 : *psolution=1;
  167. case 2 : *psolution=2;
  168. case 3 : *psolution=3;
  169. case 4 : *psolution=4;
  170. case 5 : *psolution=5;
  171. case 6 : *psolution=6;
  172. case 7 : *psolution=7;
  173. case 8 : *psolution=8;
  174. case 9 : *psolution=9;
  175. }
  176.  
  177. }
  178. return 1;
  179. }
  180. else { //else omvat beide andere gevallen: als er niet exact 8 getallen zijn die het niet kunnen zijn, is de oplossing ofwel reeds bekend (0) of hebben we onvoldoende informatie (0-7)
  181. return 0;
  182. }
  183. }
  184.  
  185. void sudoku_solve(sudoku *sdku) {
  186. int i;
  187. int j;
  188. int changed = 1;
  189. int* psolution;
  190.  
  191. while(changed) {
  192. changed = 0;
  193.  
  194. for(i=0; i<9; i++) {
  195. for(j=0; j<9; j++) {
  196. if (sudoku_deducesolution(*sdku, i, j, psolution)) {
  197. sudoku_setsolution(*sdku, i, j, *psolution);
  198. changed = 1; //zodra we 1 keer een oplossing kunnen deducen zetten we de changed op 1
  199. }
  200. }
  201. }
  202. }
  203. }
Add Comment
Please, Sign In to add comment