生成一个数独的解:
定义: 一个 3*3 的整体我称之为box, 那一个9*9 的数独盘里就有 9 个 box,编号依次为1-9:
|
|
|
|
|
|
|
|
|
| Box 1 |
|
| Box 2 |
|
| Box 3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Box 4 |
|
| Box 5 |
|
| Box 6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Box 7 |
|
| Box 8 |
|
| Box 9 |
|
|
|
|
|
|
|
|
|
|
观察得到的事实:
1. 1-9每个数字 在每个box 里也填一次,每行也出现一次,每列也出现一次,于根据这个规则,我们可以把 这个数独盘里的所有1都一次填下去:
1 |
|
|
|
|
|
|
|
|
|
|
| 1 |
|
|
|
|
|
|
|
|
|
|
| 1 |
|
|
| 1 |
|
|
|
|
|
|
|
|
|
|
| 1 |
|
|
|
|
|
|
|
|
|
|
| 1 |
|
|
| 1 |
|
|
|
|
|
|
|
|
|
|
| 1 |
|
|
|
|
|
|
|
|
|
|
| 1 |
2. 接着,我们可以在1 的下面把 2也填下去:
1 |
|
|
|
|
| 2 |
|
|
2 |
|
| 1 |
|
|
| Box 3 |
|
|
|
| 2 |
|
| 1 |
|
|
| 1 |
|
|
|
|
| 2 |
|
| 2 |
|
| 1 |
|
|
|
|
|
|
|
| 2 |
|
| 1 |
|
|
| 1 |
|
|
|
|
| 2 |
|
| 2 |
|
| 1 |
|
|
|
|
|
|
|
| 2 |
|
| 1 |
注意: 填的规则是这样, 如果 1 的正下方有一个空格,并且该空格与1在同一个box内,则填入2, 否则,在1的正上方隔两格的地方填入2, 如上图的Box 3 里的效果所示。
3. 同理,我们以同样的规则填入 3 ,4:
1 |
|
| 3 |
|
| 2 |
|
|
2 |
|
| 1 |
|
| 3 |
|
|
3 |
|
| 2 |
|
| 1 |
|
|
| 1 |
|
| 3 |
|
| 2 |
|
| 2 |
|
| 1 |
|
| 3 |
|
| 3 |
|
| 2 |
|
| 1 |
|
|
| 1 |
|
| 3 |
|
| 2 |
|
| 2 |
|
| 1 |
|
| 3 |
|
| 3 |
|
| 2 |
|
| 1 |
1 | 4 |
| 3 |
|
| 2 |
|
|
2 |
|
| 1 | 4 |
| 3 |
|
|
3 |
|
| 2 |
|
| 1 | 4 |
|
| 1 | 4 |
| 3 |
|
| 2 |
|
| 2 |
|
| 1 | 4 |
| 3 |
|
| 3 |
|
| 2 |
|
| 1 | 4 |
4 |
| 1 |
|
| 3 |
|
| 2 |
|
| 2 | 4 |
| 1 |
|
| 3 |
|
| 3 |
|
| 2 | 4 |
| 1 |
。。。
5. 如果每次都按 1 – 9 顺序填入数独盘,则每次都会得到同样的结果,但作为程序设计人,我们可以打乱 1- 9 的顺序填入数独盘,这样就可以得到不同的效果
6. 待我们填入了所有的9个数,我们就可以将i行(列)与j行(列)(其 0<|i - j|<3 )所有元素进行交换,交换后的数独排列仍会是一个数独的解
实现的java 代码:
box.java
Board.java