生成 n^2 个元素列表的所有组合,每个元素从 1 到 n?

Generate all combinations of a list of n^2 elements with each element being from 1 to n?

我正在尝试枚举给定大小的有效数独的数量。我有一个函数,将数独 t运行s 形成一个列表作为输入,并检查它是否是有效的数独。我最初的方法只是编写嵌套的 for 循环来检查列表的每个组合。对于 2 x 2 数独,我的代码如下所示:

def enumerate2x2():

cnt = 0

for i1 in range(1,3):
    for i2 in range(1,3):
        for i3 in range(1,3):
            for i4 in range(1,3):
                if checkValidSudoku([i1, i2, i3, i4]):
                    cnt += 1

print(cnt)

此代码仅生成 4 元素列表(即 2x2 数独中有多少个方块)的所有可能组合,列表中的每个元素要么是 1 要么是 2。然后它会检查每个组合。

然而,当在 5x5 数独上尝试这个时,我 运行 遇到了一个问题,因为 python 只允许你有 20 个嵌套循环,所以我想将这个丑陋的方法概括为一些东西使用任何大小的数独。任何帮助将不胜感激。

Pythonproduct内在函数,只需导入itertools模块,就是你所需要的:

import itertools

sudoku = list(itertools.product(range(1,3), repeat=4))

for x in range(len(sudoku)):
     print sudoku[x]

简单计算所有笛卡尔积,你要找的,下面是输出:

(1, 1, 1, 1)
(1, 1, 1, 2)
(1, 1, 2, 1)
(1, 1, 2, 2)
(1, 2, 1, 1)
(1, 2, 1, 2)
(1, 2, 2, 1)
(1, 2, 2, 2)
(2, 1, 1, 1)
(2, 1, 1, 2)
(2, 1, 2, 1)
(2, 1, 2, 2)
(2, 2, 1, 1)
(2, 2, 1, 2)
(2, 2, 2, 1)
(2, 2, 2, 2)

现在似乎没有组合丢失,是吗?也可以查看其他问题 ,了解有关替代实施的更多详细信息。