Chs97's Blog

Sudoku Generator

Sudoku 算法

标签(空格分隔): 软工实践


设想:通过第一行,来生成2, 3行的排列,再通过1 - 3 生成4 - 6排列。
2 3 行的生成由上一行生成
公式为$grid[i][j] = grid[i][(j + 3)%9] $
即第二行由第一行向右平移3个位置,第三行由第一行向右平移6个位置。
这样前三行满足:每一行都有1-9,前3个3*3的方块也都有1-9。
例如:

line1: 5 1 2 3 4 6 7 8 9
line2: 3 4 6 7 8 9 5 1 2
line3: 7 8 9 5 1 2 3 4 6

将1 - 3行按顺序分成 3*3的方块

s1: 5 1 2  s2: 3 4 6  s3: 7 8 9
    3 4 6      7 8 9      5 1 2
    7 8 9      5 1 2      3 4 6

第4 - 9行分别由s1-s3列变换得到
公式为\(grid[i][j] = grid[i-3][j\%3==1?j+2:j-1]\)
经过变换后

s4: 2 5 1  s5: 6 3 4  s6: 9 7 8
    6 3 4      9 7 8      2 5 1
    9 7 8      2 5 1      6 3 4
s7: 1 2 5  s8: 4 6 3  s9: 8 9 7
    4 6 3      8 9 7      1 2 5
    8 9 7      1 2 5      4 6 3

最后得到的grid是:

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

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

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

通过4 - 6行的行排列组合&7 - 9行的行排列组合可以组成

\[A_3^3*A_3^3 = 36 \]

\[36*8! >= 1e^6 \]

posted @ 2017-09-06 11:09  Chs97  阅读(289)  评论(0编辑  收藏  举报