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之间哈