Advertisement
Guest User

Untitled

a guest
Nov 11th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.30 KB | None | 0 0
  1. // 2) Find the solution to this specific 9x9 Sudoku puzzle:
  2. // 8 7 6 9 0 0 0 0 0
  3. // 0 1 0 0 0 6 0 0 0
  4. // 0 4 0 3 0 5 8 0 0
  5. // 4 0 0 0 0 0 2 1 0
  6. // 0 9 0 5 0 0 0 0 0
  7. // 0 5 0 0 4 0 3 0 6
  8. // 0 2 9 0 0 0 0 0 8
  9. // 0 0 4 6 9 0 1 7 3
  10. // 0 0 0 0 0 1 0 0 4
  11.  
  12. #include <iostream>
  13. #include <vector>
  14.  
  15. void PrintFourByFourGrid(const std::vector<int>& grid)
  16. {
  17. for (int i = 0; i < 9; ++i)
  18. {
  19. for (int j = 0; j < 9; ++j)
  20. {
  21. std::cout << grid[(i*9) + j] << " ";
  22. }
  23. std::cout << std::endl;
  24. }
  25. std::cout << std::endl;
  26. }
  27.  
  28. bool IsLegalRowColumnWhatever(const std::vector<int>& vector)
  29. {
  30. std::vector<int> occurrences(vector.size() + 1);
  31.  
  32. try
  33. {
  34. for (const int& i : vector)
  35. {
  36. ++occurrences.at(i);
  37. }
  38. }
  39.  
  40. catch (const std::exception&)
  41. {
  42. return false;
  43. }
  44.  
  45. for (std::size_t i = 1; i < occurrences.size(); ++i)
  46. {
  47. if (occurrences[i] > 1)
  48. {
  49. return false;
  50. }
  51. }
  52.  
  53. return true;
  54. }
  55.  
  56. bool IsNineByNineSudokuLegal(const std::vector<int>& grid)
  57. {
  58. int rows[] = { 0, 9, 18, 27, 36, 45, 54, 63, 72 };
  59. for (const int& i : rows)
  60. {
  61. std::vector<int> v{ grid[i], grid[i + 1], grid[i + 2], grid[i + 3], grid[i+4], grid[i+5], grid[i+6], grid[i+7], grid[i+8] };
  62. if (IsLegalRowColumnWhatever(v) == false)
  63. {
  64. return false;
  65. }
  66. }
  67.  
  68. int columns[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
  69. for (const int& i : columns)
  70. {
  71. std::vector<int> v{ grid[i], grid[i + 9], grid[i + 18], grid[i + 27], grid[i + 36], grid[i + 45], grid[i + 54], grid[i + 63], grid[i + 72] };
  72. if (IsLegalRowColumnWhatever(v) == false)
  73. {
  74. return false;
  75. }
  76. }
  77.  
  78. int squares[] = { 0, 3, 6, 27, 30, 33, 54, 57, 60 };
  79. for (const int& i : squares)
  80. {
  81. std::vector<int> v{ grid[i], grid[i + 1], grid[i + 2], grid[i + 9], grid[i + 10], grid[i + 11], grid[i + 18], grid[i + 19], grid[i + 20] };
  82. if (IsLegalRowColumnWhatever(v) == false)
  83. {
  84. return false;
  85. }
  86. }
  87.  
  88. return true;
  89. }
  90.  
  91. void GenerateValidNineByNineGrids(std::vector<int>& grid, int index)
  92. {
  93. if (index == 81)
  94. {
  95. PrintFourByFourGrid(grid);
  96. }
  97. else
  98. {
  99. for (int i = 1; i <= 9; ++i)
  100. {
  101. if (grid[index] == 0)
  102. {
  103. GenerateValidNineByNineGrids(grid, index + 1);
  104.  
  105. }
  106. if (IsNineByNineSudokuLegal(grid) == true)
  107. {
  108. GenerateValidNineByNineGrids(grid, index + 1);
  109. }
  110. }
  111. }
  112. }
  113.  
  114. void GenerateAllValidNineByNineGrids()
  115. {
  116. std::vector<int> grid(81, 0);
  117.  
  118. GenerateValidNineByNineGrids(grid, 0);
  119. }
  120.  
  121. int main()
  122. {
  123. std::vector<int> grid(81, 0);
  124. grid[0] = 8;
  125. grid[1] = 7;
  126. grid[2] = 6;
  127. grid[3] = 9;
  128. grid[10] = 1;
  129. grid[14] = 6;
  130. grid[19] = 4;
  131. grid[21] = 3;
  132. grid[23] = 5;
  133. grid[24] = 8;
  134. grid[27] = 4;
  135. grid[33] = 2;
  136. grid[34] = 1;
  137. grid[37] = 9;
  138. grid[39] = 5;
  139. grid[46] = 5;
  140. grid[49] = 4;
  141. grid[51] = 3;
  142. grid[53] = 6;
  143. grid[55] = 2;
  144. grid[56] = 9;
  145. grid[62] = 8;
  146. grid[65] = 4;
  147. grid[66] = 6;
  148. grid[67] = 9;
  149. grid[69] = 1;
  150. grid[70] = 7;
  151. grid[71] = 3;
  152. grid[77] = 1;
  153. grid[80] = 4;
  154. GenerateValidNineByNineGrids(grid, 0);
  155. // 8 7 6 9 0 0 0 0 0
  156. // 0 1 0 0 0 6 0 0 0
  157. // 0 4 0 3 0 5 8 0 0
  158. // 4 0 0 0 0 0 2 1 0
  159. // 0 9 0 5 0 0 0 0 0
  160. // 0 5 0 0 4 0 3 0 6
  161. // 0 2 9 0 0 0 0 0 8
  162. // 0 0 4 6 9 0 1 7 3
  163. // 0 0 0 0 0 1 0 0 4
  164.  
  165. system("PAUSE");
  166. return 0;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement