C++ 数独游戏
C++ 数独游戏
直接上代码:
1 // 数独 sudoku 2 3 #include <iostream> 4 5 using namespace std; 6 7 int P[9][9]; 8 bool flag = false; 9 10 // 处理输入 11 void input(){ 12 char t; 13 cout << "输入棋盘,空用 0 表示\n"; 14 for(int i = 0; i < 9; i ++){ 15 for(int j = 0; j < 9; j ++){ 16 cin >> t; 17 P[i][j] = t - '0'; 18 } 19 } 20 } 21 22 // 处理输出 23 void output(){ 24 for(int i = 0; i < 9; i ++){ 25 for(int j = 0; j < 9; j ++){ 26 27 if(P[i][j]){ 28 cout << P[i][j]; 29 }else{ 30 cout << " "; 31 } 32 33 if(j%3 == 2) cout << " "; 34 } 35 if(i%3 == 2) cout << endl; 36 cout << endl; 37 } 38 39 } 40 41 // 判断即将放入的 是否符合条件 42 bool check(int n, int num){ 43 44 // 行 45 for(int i = 0; i < 9; i ++){ 46 if(P[n/9][i] == num){ 47 return false; 48 } 49 } 50 51 // 列 52 for(int i = 0; i < 9; i ++){ 53 if(P[i][n%9] == num){ 54 return false; 55 } 56 } 57 58 // 宫 59 int x = n / 9 / 3 * 3; 60 int y = n % 9 / 3 * 3; 61 for(int i = 0; i < 3; i ++){ 62 for(int j = 0; j < 3; j ++){ 63 if(P[x+i][y+j] == num){ 64 return false; 65 } 66 } 67 } 68 69 return true; 70 } 71 72 // [n/9][n%9] 73 void dfs(int n){ 74 75 // 成功 76 if(n > 80){ 77 flag = true; 78 return; 79 } 80 81 int x = n/9, y = n%9; 82 // 有值 跳过 83 if(P[x][y]){ 84 dfs(n+1); 85 return; 86 } 87 // 遍历 88 for(int i = 1; i <= 9; i ++){ 89 // 判断 90 if(check(n, i)){ 91 // 判断成功 赋值 92 P[x][y] = i; 93 dfs(n+1); 94 // 退出时判断是否完成 完成时退出 95 if(flag){ 96 return; 97 } 98 // 未完成 重置棋盘 99 P[x][y] = 0; 100 } 101 } 102 } 103 104 int main(){ 105 input(); 106 cout << endl << endl; 107 dfs(0); 108 output(); 109 return 0; 110 } 111 112 113 /* 114 115 测试用例 116 117 170004000 118 360810054 119 008050109 120 007035048 121 000000270 122 000008601 123 000060080 124 700000000 125 000403016 126 127 */
测试用例子结果
百度百科 世界最难数独
答案秒出, 没有什么是暴力解决不了的~
楠少博客同步更新:https://blog.nanshaobit.top/95
个人博客: | https://blog.nanshaobit.top |
CSDN: | https://blog.csdn.net/LZ_nanshao |
码云: | https://gitee.com/nanshaobit |
Github: | https://github.com/nanshaobit |