解决数独
2020-06-11 17:06:00 # ACM

什么是数独

数独(shù dú)是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复 [1] 。
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
————百度百科

怎么解数独

带脑子算(手算法)

在我没上大学之前,那就是手算了,一个个数字试着填,填满了即为完成了
显然效率低而且还头疼(0.0)

不带脑子算(复读机式算法)

试着想了一下数独如何用计算机来解,于是结合一下所学
下面这段c++代码编译运行下,把数独盘面输入下就出结果了
我的贡献0%(复读题目+1%),计算机贡献99%,(•ิ_•ิ)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <bits/stdc++.h>
#define MS 11
using namespace std;

int flag;
char smp[MS][MS];
int mp[MS][MS],ans[MS][MS];
int vp_row[MS][MS];
int vp_col[MS][MS];
int vp_cel[4][4][MS];

int change(char c){
if('1'<=c&&c<='9') return c-'0';
else return 0;
}

int check(int x,int y,int num){
int jdg_row = vp_row[x][num];
int jdg_col = vp_col[y][num];
int jdg_cel = vp_cel[x/3][y/3][num];
if(jdg_row||jdg_col||jdg_cel) return 0;
return 1;
}

void add_or_del_lab(int x,int y,int num,int jdg){
vp_row[x][num] = jdg;
vp_col[y][num] = jdg;
vp_cel[x/3][y/3][num] = jdg;
}

void input_smp(){
for(int i=0;i<9;i++) gets(smp[i]);
}

void into_mp(){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
mp[i][j] = change(smp[i][j]);
add_or_del_lab(i,j,mp[i][j],1);
}
}
}

void solve(int step){

if(step==9*9){
flag = 1;
printf("\n");
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
printf("%d ",ans[i][j]);
}
printf("\n");
}
printf("\n");
}

if(mp[step/9][step%9]!=0){
ans[step/9][step%9] = mp[step/9][step%9];
solve(step+1);
return;
}

for(int i=1;i<=9;i++){
int now_x = step/9;
int now_y = step%9;
if(check(now_x,now_y,i)&&mp[now_x][now_y]==0){
add_or_del_lab(now_x,now_y,i,1);
ans[now_x][now_y] = i;
solve(step+1);
add_or_del_lab(now_x,now_y,i,0);
}
}
}

int main() {
printf("输入你想解决的数独:\n");
printf("===================\n");
printf("注:(9*9)空缺数字用空格代替\n");
printf("===================\n");
input_smp();
into_mp();
solve(0);
if(!flag)
printf("未找到解,请检查输入是否正确合法\n");
return 0;
}

/*

input:

2 5 9 8
7 5
19 7
6 7
3 8 4
7 95 862
8 594
234 6
74 15

output:

4 2 7 5 3 9 6 8 1
8 6 3 1 7 4 2 5 9
1 9 5 8 6 2 7 3 4
2 8 6 4 1 7 3 9 5
5 3 9 2 8 6 4 1 7
7 4 1 9 5 3 8 6 2
6 1 8 7 2 5 9 4 3
9 5 2 3 4 8 1 7 6
3 7 4 6 9 1 5 2 8

*/

然后发现网络上早已有了数独求解器(..•˘_˘•..)

复读式解数独有啥用

有利于老年痴呆~

Prev
2020-06-11 17:06:00 # ACM
Next