Advertisement
Guest User

Untitled

a guest
Apr 25th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. /*
  2. * Solve a Sudoku puzzle by a backtracking algorithm.
  3. * Nicholas Lydeen, 2017/04/24
  4. */
  5.  
  6. #include <stdio.h>
  7.  
  8. #ifdef ANIMATED
  9. #include <signal.h>
  10. #include <stdlib.h>
  11. #include <time.h>
  12. struct timespec tm = {.tv_sec = 0, .tv_nsec = 1e8};
  13.  
  14. void clear_screen(int sig) {
  15. printf("\e[H\e[2J");
  16. }
  17.  
  18. void cleanup(int sig) {
  19. printf("\e[2J\e[?47l\e8");
  20. exit(0);
  21. }
  22. #endif
  23.  
  24. int initial_grid[81] = {
  25. 9, 0, 0, 0, 0, 5, 7, 0, 1,
  26. 2, 0, 8, 9, 1, 4, 0, 0, 0,
  27. 1, 6, 0, 0, 8, 0, 0, 0, 2,
  28. 0, 0, 0, 5, 0, 2, 9, 4, 0,
  29. 0, 5, 0, 1, 0, 9, 3, 7, 0,
  30. 6, 3, 0, 0, 0, 0, 2, 0, 0,
  31. 0, 1, 6, 0, 7, 0, 0, 2, 0,
  32. 8, 0, 7, 0, 5, 1, 0, 0, 4,
  33. 0, 0, 4, 8, 0, 0, 0, 5, 7
  34. };
  35.  
  36. int is_legal(int grid[81]) {
  37. for(int i = 0; i < 9; ++i) {
  38. int counter_1[10], counter_2[10];
  39. for(int j = 0; j < 10; ++j)
  40. counter_1[j] = counter_2[j] = 0;
  41. for(int j = 0; j < 9; ++j) {
  42. int k_1 = 9 * i + j,
  43. k_2 = 9 * j + i;
  44. ++counter_1[grid[k_1]];
  45. ++counter_2[grid[k_2]];
  46. if(grid[k_1] > 0 && counter_1[grid[k_1]] > 1)
  47. return 0;
  48. else if(grid[k_2] > 0 && counter_2[grid[k_2]] > 1)
  49. return 0;
  50. }
  51. }
  52.  
  53. for(int p = 0; p < 3; ++p)
  54. for(int q = 0; q < 3; ++q) {
  55. int counter[10];
  56. for(int i = 0; i < 10; ++i)
  57. counter[i] = 0;
  58. for(int i = 0; i < 3; ++i)
  59. for(int j = 0; j < 3; ++j) {
  60. int k = (27 * p + 3 * q) + (9 * i + j);
  61. ++counter[grid[k]];
  62. if(grid[k] > 0 && counter[grid[k]] > 1)
  63. return 0;
  64. }
  65. }
  66.  
  67. return 1;
  68. }
  69.  
  70. void display(int grid[81]) {
  71. puts("Lydeen's Backtracking Sudoku Solver\n");
  72. for(int k = 0; k < 81; ++k) {
  73. if(grid[k])
  74. printf("%d ", grid[k]);
  75. else
  76. printf(". ");
  77. if(k % 9 == 8)
  78. putchar('\n');
  79. }
  80. }
  81.  
  82. int main() {
  83. #ifdef ANIMATED
  84. signal(SIGWINCH, clear_screen);
  85. signal(SIGINT, cleanup);
  86. printf("\e7\e[?47h\e[H\e[2J\e[?25l");
  87. #endif
  88.  
  89. int grid[81];
  90. for(int k = 0; k < 81; ++k)
  91. grid[k] = initial_grid[k];
  92.  
  93. int k = 0;
  94. while(k < 81)
  95. if(initial_grid[k] != 0)
  96. ++k;
  97. else {
  98. do
  99. ++grid[k];
  100. while(grid[k] < 9 && !is_legal(grid));
  101.  
  102. if(grid[k] <= 9 && is_legal(grid))
  103. ++k;
  104. else {
  105. grid[k] = 0;
  106. do
  107. --k;
  108. while(k > 0 && initial_grid[k] != 0);
  109. }
  110.  
  111. #ifdef ANIMATED
  112. printf("\e[1;1H");
  113. display(grid);
  114. nanosleep(&tm, NULL);
  115. #endif
  116. }
  117.  
  118. #ifdef ANIMATED
  119. puts("\nSolved! Press ^C to exit.");
  120. tm.tv_sec = 1e12;
  121. while(1)
  122. nanosleep(&tm, NULL);
  123. #else
  124. display(grid);
  125. #endif
  126.  
  127. return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement