首页 > 解决方案 > 生成n^2个元素列表的所有组合,每个元素从1到n?

问题描述

我正在尝试枚举给定大小的有效数独的数量。我有一个函数将数独转换为列表作为输入并检查它是否是有效的数独。我最初的方法只是编写嵌套的 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 个嵌套循环,所以我想将这种丑陋的方法推广到适用于任何大小的数独的东西。任何帮助,将不胜感激。

标签: python-3.xcombinationsitertoolscombinatoricssudoku

解决方案


只需导入模块的 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)

现在似乎没有缺少任何组合,不是吗?看看这个其他问题Combinations with repeat in python ,其中 order MATTERS以获取有关替代实现的更多详细信息。


推荐阅读