数独问题(工具)

功能:

  • 输入一个数独(用二维数组表示),求出数独的解。

效果图:

这里写图片描述这里写图片描述


实现原理:

  • DFS搜索遍历。
  • 二维数组储存数据。

源代码:

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
#include<iostream>
#include<cstring>
#include<cstring>
#include<cstdio>
using namespace std;

int data[112][112];

void put()
{
cout << "----------------------" << endl;
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
cout << data[i][j] << " ";
if ((j+1)%3 == 0)
cout << " ";
}
cout << endl;
if ((i+1)%3 == 0)
cout << endl;
}
cout << "----------------------" << endl;
}


bool check(int x, int y)
{
for (int i = 0; i <= 9; i++)
{
if (data[i][y] == data[x][y] && i != x)
return false;
if (data[x][i] == data[x][y] && i != y)
return false;
}

int x0 = x/3*3;
int y0 = y/3*3;

for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (i+x0 == x && j+y0 == y)
continue;
if (data[i+x0][j+y0] == data[x][y])
return false;
}
}

return true;
}

int fun(int cnt)
{
int x, y;
if (cnt == 81)
return 1;

x = cnt/9;
y = cnt%9;


if (data[x][y] != 0)
{
fun(cnt+1);
}
else
{
for (int i = 1; i <= 9; i++)
{
data[x][y] = i;
if (check(x, y))
{
if(fun(cnt+1))
return 1;
}
}
data[x][y] = 0;
return 0;
}
}

int main()
{
int n, x, y, t;
while (cin >> n)
{
memset(data, 0, sizeof(data));
for (int i = 0; i < n; i++)
{
cin >> x >> y >> t;
data[x-1][y-1] = t;
}
fun(0);
cout << "end" << endl;
put();
}
}

PS:

当初群里有人问一个数独怎么解时,然后自己DFS也不太熟练,花了半个小时写了这个,满满的成就感!