首页 > 其他 > 详细

数独游戏

时间:2020-02-14 14:29:30      阅读:55      评论:0      收藏:0      [点我收藏+]

你一定听说过“数独”游戏。
如【图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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!