如何索引 9x9 数独板的 3x3 子块

How to index a 3x3 subblock of a 9x9 Sudoku board

我正在研究数独求解器(针对 Leet 问题),我能够使用基本索引很容易地按行和列来操作 9 x 9 数字数组,例如, board[row,:]board[:,col]。这些中的每一个都从二维数组中切出一个一维数组。

我想在以下意义上对数独板的 3 x 3 子块执行等效操作。我想定义一个 Python 函数 iBlock 将块行号和块列号作为参数,并且 returns something 这样 board[something] 寻址子块的 9 个元素,因此 board[something] 可以按如下方式使用:

board[something] = [ 3, 7, 2, 1, 4, 5, 9, 8, 6 ]

会产生将整个 9 x 9 板从

. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . - - - . . .
. . . - - - . . .
. . . - - - . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .

至:

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

我也希望能够在作业的右侧使用 board[something]

所以问题是...什么是 东西 才能像上面那样工作?

希望这些信息对您有所帮助。我会使用 numpy and slicing.

这里有一个小例子,希望能产生您想要的结果:

import numpy as np

mat = np.zeros((9,9))
start = 3
end = 6
mat[start:end,start:end] = np.array([ 3, 7, 2, 1, 4, 5, 9, 8, 6 ]).reshape((3,3))

print(mat)
[[0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 3. 7. 2. 0. 0. 0.]
 [0. 0. 0. 1. 4. 5. 0. 0. 0.]
 [0. 0. 0. 9. 8. 6. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]]

四处寻找,我想我找到了解决方案:

def iBlock( R, C ):
    return ( [3*R,3*R,3*R,3*R+1,3*R+1,3*R+1,3*R+2,3*R+2,3*R+2],
             [3*C,3*C+1,3*C+2,3*C,3*C+1,3*C+2,3*C,3*C+1,3*C+2] )
iBlock(1,2)
=> ([3, 3, 3, 4, 4, 4, 5, 5, 5], [6, 7, 8, 6, 7, 8, 6, 7, 8])

a = np.zeros((9,9))
a[ iBlock(1,2) ] = range(1,10)

a =>
array([[0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1., 2., 3.],
       [0., 0., 0., 0., 0., 0., 4., 5., 6.],
       [0., 0., 0., 0., 0., 0., 7., 8., 9.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.]])