如何索引 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.]])
我正在研究数独求解器(针对 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.]])