覆盖其实不简单
问题:设边长为4的正方形,用长为2,宽为1的长方形将它全部覆盖,编程打印所有覆盖方法。
┌───┬───┬───┬───┐
│ │ │ │ │
├ ┼ ┼ ┼ ┤
│ │ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │ │
├ ┼ ┼ ┼ ┤
│ │ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │ │
├ ┼ ┼ ┼ ┤
│ │ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │
└───┴───┴───┴───┘
解题思路:
1、首先考虑用16个边长为1的正方形覆盖。
2、分析任意一个满足条件的覆盖,都是8个2×1长方形组成。
3、对于满足条件的覆盖,原任意一个1×1正方形的四边有且有一边是打开的,并且两两共用,因此每一个满足条件的覆盖须要打开8条边。
4、关键来了,为能够打开的24条边设置一个数组,如下图所示,原始默认都未打开。
b12 b16 b20
b0 b1 b2 b3
b13 b17 b21
b4 b5 b6 b7
b14 b18 b22
b8 b9 b10 b11
b15 b19 b23
5、在24条边中任意选出8条边进行打开,打开为0,未打开为1。
6、判断每一种打开方式是否满足2×1覆盖,符合的进行打印。
import itertools
import copy
tab_start = '┌───┬───┬───┬───┐'
tab_end = '└───┴───┴───┴───┘'
a = [i for i in range(24)] # 为24条边设置序号0,1,……23
base = [1 for i in range(24)] # 为24条边设置原始数据1(未打开)
c = itertools.combinations(a, 8) # 获取24取8的所有组合
count = 0
for cc in c:
b = copy.deepcopy(base)
for ccc in cc: # 为打开的边赋值0
b[ccc] = 0 # ccc此时就是边的序号,如果这个理解了,其他都不是问题
# 每一个1×1正方形有且有一边是打开的,对所有16个1×1正方形都作此判断,只要有一个不满足,就说明无法用2×1长方形覆盖
if [b[0], b[12]].count(0) != 1 or [b[3], b[20]].count(0) != 1 or \
[b[8], b[15]].count(0) != 1 or [b[11], b[23]].count(0) != 1:
continue
if [b[1], b[12], b[16]].count(0) != 1 or [b[2], b[16], b[20]].count(0) != 1:
continue
if [b[0], b[4], b[13]].count(0) != 1 or [b[4], b[8], b[14]].count(0) != 1:
continue
if [b[3], b[7], b[21]].count(0) != 1 or [b[7], b[11], b[22]].count(0) != 1:
continue
if [b[9], b[15], b[19]].count(0) != 1 or [b[10], b[19], b[23]].count(0) != 1:
continue
if [b[1], b[5], b[13], b[17]].count(0) != 1 or [b[2], b[6], b[17], b[21]].count(0) != 1:
continue
if [b[5], b[9], b[14], b[18]].count(0) != 1 or [b[6], b[10], b[18], b[22]].count(0) != 1:
continue
# print(b)
temp = []
for index, p in enumerate(b):
if p == 0:
temp.append(" ")
elif index < 12:
temp.append("─")
else:
temp.append("│")
print(tab_start)
print("│ ", temp[12], " ", temp[16], " ", temp[20], " │")
print("├", temp[0], "┼", temp[1], "┼", temp[2], "┼", temp[3], "┤")
print("│ ", temp[13], " ", temp[17], " ", temp[21], " │")
print("├", temp[4], "┼", temp[5], "┼", temp[6], "┼", temp[7], "┤")
print("│ ", temp[14], " ", temp[18], " ", temp[22], " │")
print("├", temp[8], "┼", temp[9], "┼", temp[10], "┼", temp[11], "┤")
print("│ ", temp[15], " ", temp[19], " ", temp[23], " │")
print(tab_end)
count += 1
print("满足条件的覆盖有{}种。".format(count))
D:\Python\Python38\python.exe D:/Python/study/test30.py
┌───┬───┬───┬───┐
│ │ │ │ │
├ ┼ ┼ ┼ ┤
│ │ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │ │
├ ┼ ┼ ┼ ┤
│ │ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │ │
├ ┼ ┼ ┼ ┤
│ │ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │ │
├ ┼ ┼ ┼ ┤
│ │ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ┼ ─ ┼ ─ ┼ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │ │
├ ┼ ┼ ┼ ┤
│ │ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │ │
├ ┼ ┼ ┼ ┤
│ │ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │ │
├ ┼ ┼ ┼ ┤
│ │ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ┼ ─ ┼ ─ ┼ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ┼ ─ ┼ ─ ┼ ┤
│ │ │ │ │
├ ─ ┼ ┼ ┼ ─ ┤
│ │ │ │ │
├ ┼ ─ ┼ ─ ┼ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ┼ ─ ┼ ─ ┼ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │ │
├ ┼ ┼ ┼ ┤
│ │ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ┼ ─ ┼ ─ ┼ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ┼ ─ ┼ ─ ┼ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ┼ ─ ┼ ─ ┼ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ┼ ─ ┼ ─ ┼ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ┼ ─ ┼ ─ ┼ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │ │
├ ┼ ┼ ┼ ┤
│ │ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ┼ ─ ┼ ─ ┼ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │ │
├ ┼ ┼ ┼ ┤
│ │ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ┼ ─ ┼ ─ ┼ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │ │
├ ┼ ┼ ┼ ┤
│ │ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ┼ ┼ ─ ┼ ─ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ┼ ─ ┼ ─ ┼ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │ │
├ ─ ┼ ─ ┼ ┼ ┤
│ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┐
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
├ ─ ┼ ─ ┼ ─ ┼ ─ ┤
│ │ │
└───┴───┴───┴───┘
满足条件的覆盖有36种。
Process finished with exit code 0