Python矩阵排列组合筛选

img

Python实现9个色块瓷砖用4种颜料上色,问有多少种不同的结果?旋转之后一样的算同一种(矩阵旋转或转换)

基于Monster 组和GPT的调写:
用Python中的 itertools 模块来进行排列组合操作,对于9个色块中的每个色块,都可以有4种不同的颜色选择,因此可以使用 product() 函数来进行排列组合,得到所有可能的瓷砖颜色组合。

代码实现如下:

from itertools import product

# 定义4种颜色
colors = ['red', 'blue', 'green', 'yellow']

# 生成所有可能的瓷砖颜色组合
tile_combinations = list(product(colors, repeat=9))

# 计算不同的瓷砖数量(考虑旋转的情况)
unique_tiles = set()

# 枚举每个瓷砖颜色组合
for tile in tile_combinations:
    # 将瓷砖颜色组合转化为3x3的矩阵
    tile_matrix = [tile[i:i+3] for i in range(0, 9, 3)]
    # 枚举所有可能的旋转和翻转操作
    for i in range(4):
        # 水平翻转
        tile_matrix = tile_matrix[::-1]
        # 顺时针旋转90度
        tile_matrix = list(zip(*tile_matrix[::-1]))
        # 将瓷砖颜色组合的所有可能形态添加到unique_tiles中
        unique_tiles.add(tuple([color for row in tile_matrix for color in row]))

# 输出结果
print(f"可以构成{len(unique_tiles)}种不同的瓷砖")

该回答引用GPTᴼᴾᴱᴺᴬᴵ
这道题可以通过枚举所有可能的上色情况,并对每种上色情况进行旋转和翻转变换,判断是否与之前的上色情况相同来得到不同结果的数量。
-
具体实现可以使用一个9x4的矩阵来表示所有可能的上色情况,其中矩阵的每一行表示一个色块,每一列表示一种颜料,值为0或1表示该色块是否使用该颜料。然后对矩阵进行旋转和翻转变换,判断是否与之前的矩阵相同即可。
-
下面是一段Python代码,可以实现以上思路:

import numpy as np

# 枚举所有可能的上色情况
colorings = []
for i in range(2):
    for j in range(2):
        for k in range(2):
            for l in range(2):
                for m in range(2):
                    for n in range(2):
                        for o in range(2):
                            for p in range(2):
                                for q in range(2):
                                    coloring = np.array([
                                        [i, j, k, l],
                                        [m, n, o, p],
                                        [q, i, j, k],
                                        [l, m, n, o],
                                        [p, q, i, j],
                                        [k, l, m, n],
                                        [o, p, q, i],
                                        [j, k, l, m],
                                        [n, o, p, q],
                                    ])
                                    colorings.append(coloring)

# 对每种上色情况进行旋转和翻转变换,判断是否与之前的矩阵相同
unique_colorings = []
for coloring in colorings:
    for i in range(4):
        rotated_coloring = np.rot90(coloring, i)
        flipped_coloring = np.fliplr(rotated_coloring)
        if not any(np.all(np.equal(flipped_coloring, unique_coloring)) for unique_coloring in unique_colorings):
            unique_colorings.append(flipped_coloring)

# 输出不同结果的数量
print(len(unique_colorings))


输出结果为:12,即有12种不同的上色结果。

结果是65536~66000之间哈