2020-10-29

95 篇文章 2 订阅
该博客探讨了如何使用Python编程实现用长为2,宽为1的长方形覆盖一个边长为4的正方形的所有可能方法。通过创建并分析24条边的状态数组,博主展示了如何通过组合来找出所有符合条件的覆盖方案,最终得出共有36种不同的覆盖方式。
摘要由CSDN通过智能技术生成

覆盖其实不简单

问题:设边长为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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值