你一定听说过“数独”游戏。
如【图1.png】,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。
数独的答案都是唯一的,所以,多个解也称为无解。
本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。
本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。
格式要求,输入9行,每行9个数字,0代表未知,其它数字为已知。
输出9行,每行9个数字表示数独的解。
例如:
输入(即图中题目):
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700
程序应该输出:
145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764
再例如,输入:
800000000
003600000
070090200
050007000
000045700
000100030
001000068
008500010
090000400
程序应该输出:
812753649
943682175
675491283
154237896
369845721
287169534
521974368
438526917
796318452
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 2000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
1 #include <iostream> 2 #include <algorithm> 3 #include <sstream> 4 #include <cstring> 5 #include <string> 6 #include <vector> 7 using namespace std; 8 9 void show_map(char** map, int row, int col) { 10 for (int i = 0; i < row; i++) { 11 for (int j = 0; j < col; j++) { 12 cout << map[i][j] << " "; 13 } 14 cout << endl; 15 } 16 } 17 18 //检查当前坐标能不能放数字num 19 bool canPut(char** map, int num, int x, int y) { 20 char ch = num + ‘0‘; 21 for (int i = 0; i < 9; i++) { 22 if (map[x][i] == ch) {//同一行 23 return false; 24 } 25 if (map[i][y] == ch) {//同一列 26 return false; 27 } 28 } 29 //同一个九宫格(先根据当前坐标找到同一个九宫格的起点) 30 int x_begin = (x / 3) * 3; 31 int y_begin = (y / 3) * 3; 32 for (int i = 0; i < 3; i++) { 33 for (int j = 0; j < 3; j++) { 34 if (map[x_begin + i][y_begin + j] == ch) { 35 return false; 36 } 37 } 38 } 39 return true; 40 } 41 42 //x,y表示当前坐标 43 void DFS(char** map, int x, int y) { 44 if (x == 9) {//递归出口 45 show_map(map, 9, 9); 46 exit(0); 47 } 48 if (map[x][y] == ‘0‘) { 49 //1--9 50 for (int i = 1; i <= 9; i++) { 51 if (canPut(map, i, x, y)) { 52 map[x][y] = i + ‘0‘;//这里注意int转char 53 DFS(map, x + (y + 1) / 9, (y + 1) % 9); 54 } 55 } 56 map[x][y] = ‘0‘;//回溯(重置) 57 } 58 else { 59 DFS(map, x + (y + 1) / 9, (y + 1) % 9); 60 } 61 } 62 63 int main() { 64 //输入处理 65 string str_array[9]; 66 char** map = new char*[9]; 67 for (int i = 0; i < 9; i++) { 68 map[i] = new char[9]; 69 } 70 for (int i = 0; i < 9; i++) { 71 cin >> str_array[i]; 72 } 73 //string转char数组 74 for (int i = 0; i < 9; i++) { 75 strcpy_s(map[i], str_array[i].length() + 1, str_array[i].c_str());//注意+1表示结束符的位置‘\0‘ 76 } 77 DFS(map, 0, 0); 78 return 0; 79 }
原文:https://www.cnblogs.com/leolin20/p/12307050.html