数独子集生成

时间:2012-03-11 21:12:20

标签: python

我有一个9x9的数独板。我必须创建9个子方列表。我将每个列表作为一行存储在另一个名为sub_square的列表中。

CODE:

sub_square = []
sub_list = []
for x in range(0,3):
    for y in range(0,3):
        sub_list.append(sudoku[x][y])

sub_square.append(sub_list)
sub_list = []

for x in range (0,3):
    for y in range(3,6):
        sub_list.append(sudoku[x][y])

sub_square.append(sub_list)
sub_list = []

for x in range (0,3):
    for y in range(6,9):
        sub_list.append(sudoku[x][y])

sub_square.append(sub_list)
sub_list = []

我对其他6个子方块做同样的事情。有没有其他方法更简单。

SUDOKU:

 [0, 9, 4, 3, 0, 0, 0, 0, 0],
 [0, 0, 7, 5, 0, 0, 0, 0, 0],
 [0, 0, 1, 4, 0, 0, 0, 2, 0],

 [4, 6, 0, 8, 0, 0, 0, 0, 3],
 [0, 0, 0, 0, 0, 0, 0, 0, 0],
 [2, 0, 0, 0, 0, 3, 0, 6, 9],

 [0, 5, 0, 0, 0, 6, 2, 0, 0],
 [0, 0, 0, 0, 0, 5, 1, 0, 0],
 [0, 0, 0, 0, 0, 1, 6, 4, 0]

所以第一个子方列表是:

[0, 9, 4, 0, 0, 7, 0, 0, 1]

4 个答案:

答案 0 :(得分:3)

是的,有一种更简单的方法:

subsquares = [[sudokuSquare[j][i] for j in range(x, x + w) for i in range(y, y + h)] for x in range(0, 9, 3) for y in range(0, 9, 3)]

其中hw分别是每个子方格的高度和宽度。 (为了您的目的,hw都等于3。

答案 1 :(得分:2)

for y in range(0,3):

for y in range(3,6):

for y in range(6,9):

如果你看看你的三个代码块,除了上面引用的行之外,它们是相同的。这意味着您可以在另一个循环中用一个代码块替换它们,这个循环用作y循环范围的参数。然后,您需要第四个循环,您可以将其用作x循环范围的参数。然后你会得到Joel的答案,尽管他已经使用了迭代器,所以他可以把它全部折叠成一行代码。

答案 2 :(得分:1)

如果您不反对第三方库,请使用numpy

import numpy as np

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

print(board)
print()
print(board[3,1])     # 4th row, 2nd column
print()
print(board[3])       # 4th row
print()
print(board[...,2])   # 3rd column
print(board[:,2:3])   # 3rd column (another way)
print()
print(board[0:3,0:3]) # first sub-square
print(board[0:3,0:3].flatten()) # another way

输出

[[0 9 4 3 0 0 0 0 0]
 [0 0 7 5 0 0 0 0 0]
 [0 0 1 4 0 0 0 2 0]
 [4 6 0 8 0 0 0 0 3]
 [0 0 0 0 0 0 0 0 0]
 [2 0 0 0 0 3 0 6 9]
 [0 5 0 0 0 6 2 0 0]
 [0 0 0 0 0 5 1 0 0]
 [0 0 0 0 0 1 6 4 0]]

6

[4 6 0 8 0 0 0 0 3]

[4 7 1 0 0 0 0 0 0]
[[4]
 [7]
 [1]
 [0]
 [0]
 [0]
 [0]
 [0]
 [0]]

[[0 9 4]
 [0 0 7]
 [0 0 1]]
[0 9 4 0 0 7 0 0 1]

答案 3 :(得分:0)

改进Mark Tolonen的numpy答案,您可以自动完成此过程。我假设你已经创建了numpy对象board

def subsquare(A,k,i,j):
    return A[i*k:(i+1)*k, j*k:(j+1)*k].flatten().tolist()

def sub_itr(A,block_size):
    assert A.shape[0]%block_size == 0  # Make sure block fits
    k = A.shape[0]/block_size
    for i in xrange(k):
        for j in xrange(k):
            yield subsquare(A,k,i,j)

for block in sub_itr(board,3):
    print block

,并提供:

[0, 9, 4, 0, 0, 7, 0, 0, 1]
[3, 0, 0, 5, 0, 0, 4, 0, 0]
...
[2, 0, 0, 1, 0, 0, 6, 4, 0]