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

转载于:https://www.cnblogs.com/chs97/p/7483586.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值