故国神游,多情应笑我,早生华发。——苏轼《念奴娇·赤壁怀古》 楠少博客 阅读文章

C++ 数独游戏

摘要C++ 数独游戏

C++ 数独游戏

直接上代码:

  1. // 数独 sudoku
  2. #include <iostream>
  3. using namespace std;
  4. int P[9][9];
  5. bool flag = false;
  6. // 处理输入
  7. void input(){
  8. char t;
  9. cout << "输入棋盘,空用 0 表示\n";
  10. for(int i = 0; i < 9; i ++){
  11. for(int j = 0; j < 9; j ++){
  12. cin >> t;
  13. P[i][j] = t - '0';
  14. }
  15. }
  16. }
  17. // 处理输出
  18. void output(){
  19. for(int i = 0; i < 9; i ++){
  20. for(int j = 0; j < 9; j ++){
  21. if(P[i][j]){
  22. cout << P[i][j];
  23. }else{
  24. cout << " ";
  25. }
  26. if(j%3 == 2) cout << " ";
  27. }
  28. if(i%3 == 2) cout << endl;
  29. cout << endl;
  30. }
  31. }
  32. // 判断即将放入的 是否符合条件
  33. bool check(int n, int num){
  34. // 行
  35. for(int i = 0; i < 9; i ++){
  36. if(P[n/9][i] == num){
  37. return false;
  38. }
  39. }
  40. // 列
  41. for(int i = 0; i < 9; i ++){
  42. if(P[i][n%9] == num){
  43. return false;
  44. }
  45. }
  46. // 宫
  47. int x = n / 9 / 3 * 3;
  48. int y = n % 9 / 3 * 3;
  49. for(int i = 0; i < 3; i ++){
  50. for(int j = 0; j < 3; j ++){
  51. if(P[x+i][y+j] == num){
  52. return false;
  53. }
  54. }
  55. }
  56. return true;
  57. }
  58. // [n/9][n%9]
  59. void dfs(int n){
  60. // 成功
  61. if(n > 80){
  62. flag = true;
  63. return;
  64. }
  65. int x = n/9, y = n%9;
  66. // 有值 跳过
  67. if(P[x][y]){
  68. dfs(n+1);
  69. return;
  70. }
  71. // 遍历
  72. for(int i = 1; i <= 9; i ++){
  73. // 判断
  74. if(check(n, i)){
  75. // 判断成功 赋值
  76. P[x][y] = i;
  77. dfs(n+1);
  78. // 退出时判断是否完成 完成时退出
  79. if(flag){
  80. return;
  81. }
  82. // 未完成 重置棋盘
  83. P[x][y] = 0;
  84. }
  85. }
  86. }
  87. int main(){
  88. input();
  89. cout << endl << endl;
  90. dfs(0);
  91. output();
  92. return 0;
  93. }
  94. /*
  95. 测试用例
  96. 170004000
  97. 360810054
  98. 008050109
  99. 007035048
  100. 000000270
  101. 000008601
  102. 000060080
  103. 700000000
  104. 000403016
  105. */

测试用例子结果

百度百科 世界最难数独

答案秒出, 没有什么是暴力解决不了的~

文章评论

游客一枚~
X 取消回复
提交评论
Top