####1,构造数独
有两种方式可以用来构造数独。
#####1.1, 置换法
(1) 首先生成一个3*3的任意矩阵B5
(2) 把整个数独的各个小矩阵命名为B1….B9
(3),通过置换列的方法,利用B5,把B2和B8填好
(4),通过置换行的方法,利用B5,把B4和B6填好
(5),通过置换列的方法,利用B4,把B1和B7填好
(6),通过置换列的方法,利用B6,把B3和B9填好
* i g h|c a b|f d e
* c a b|f d e|i g h
* f d e|i g h|c a b
* -----------------
* g h i|a b c|d e f
* a b c|d e f|g h i
* d e f|g h i|a b c
* -----------------
* h i g|e f d|b c a
* b c a|h i g|e f d
* e f d|b c a|h i g
这种方法比较简单,难点主要在复制的时候要注意各个索引的大小。
1 | import java.util.ArrayList; |
####1.2,深度优先搜索
从左上到右下依次找到合法的数字。即回溯的方法。
1 | /*-----------------------------用深度优先搜索算法(回溯),生成数独初始状态---------------------------------------*/ |
####2,数独的解
用深度优先搜索的方法,搜索数独的所有解。和上面的生成初始状态的思路一样。首先把所有的空的格子的坐标都找到。然后一个空格一个空格地用回溯找。
下面为用深度优先搜索生成以及搜索解的算法。
1 | import java.util.ArrayList; |
上述代码的一个样例解为:
6 2 8 5 4 7 1 9 3
9 3 5 8 1 6 7 2 4
1 7 4 2 3 9 6 5 8
5 1 9 7 2 8 3 4 6
3 8 2 6 9 4 5 1 7
4 6 7 1 5 3 9 8 2
2 4 1 3 6 5 8 7 9
8 9 3 4 7 1 2 6 5
7 5 6 9 8 2 4 3 1
去掉一些数之后:
6 * * 5 4 7 1 * *
* 3 * 8 1 6 7 * *
* * 4 * 3 * 6 5 *
5 1 9 * 2 8 3 * *
3 8 2 6 9 4 5 1 *
4 * * * 5 * 9 8 2
2 4 1 * 6 5 * 7 *
* 9 3 * 7 * * * *
* 5 * * * 2 * * 1
需要填补的空格数为:36
深度优先搜索后的第1个解:
6 2 8 5 4 7 1 3 9
9 3 5 8 1 6 7 2 4
1 7 4 2 3 9 6 5 8
5 1 9 7 2 8 3 4 6
3 8 2 6 9 4 5 1 7
4 6 7 1 5 3 9 8 2
2 4 1 9 6 5 8 7 3
8 9 3 4 7 1 2 6 5
7 5 6 3 8 2 4 9 1
深度优先搜索后的第2个解:
6 2 8 5 4 7 1 9 3
9 3 5 8 1 6 7 2 4
1 7 4 2 3 9 6 5 8
5 1 9 7 2 8 3 4 6
3 8 2 6 9 4 5 1 7
4 6 7 1 5 3 9 8 2
2 4 1 3 6 5 8 7 9
8 9 3 4 7 1 2 6 5
7 5 6 9 8 2 4 3 1