Sudoku Generator

时间:2024-04-30 18:17:24

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
\]