蓝桥杯2022年第十三届省赛真题——刷题(3)

题目 2681:矩形拼接


题目描述:

已知 3 个矩形的大小依次是 a1 × b1, a2 × b2 和 a3 × b3。用这 3 个矩形能拼出的所有多边形中,边数最少可以是多少?例如用 3 × 2 的矩形(用 A 表示)、4 × 1 的矩形(用 B 表示)和 2 × 4 的矩形(用 C 表示)可以拼出如下 4 边形。

蓝桥杯2022年第十三届省赛真题矩形拼接1

例如用 3 × 2 的矩形(用 A 表示)、3 × 1 的矩形(用 B 表示)和 1 × 1 的矩形(用 C 表示)可以拼出如下 6 边形。

蓝桥杯2022年第十三届省赛真题矩形拼接2


输入格式:
输入包含多组数据。

第一行包含一个整数 T,代表数据组数。

以下 T 行,每行包含 6 个整数 a1, b1, a2, b2, a3, b3,其中 a1, b1 是第一个矩形的边长,a2, b2 是第二个矩形的边长,a3, b3 是第三个矩形的边长。

2
2 3 4 1 2 4
1 2 3 4 5 6

输出格式:

对于每组数据,输出一个整数代表答案。

4
6

提示:

对于 10% 的评测用例,1 ≤ T ≤ 5,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 10,a1 = a2 = a3。

对于 30% 的评测用例,1 ≤ T ≤ 5,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 10。

对于 60% 的评测用例,1 ≤ T ≤ 10,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 20。

对于所有评测用例,1 ≤ T ≤ 1000,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 100。


#定义一个函数用三个矩形求最小封闭图形的边数
def min_polygon_sides(a1, b1, a2, b2, a3, b3):
    #定义一个最小
    min_sides = float('inf')
    #循环出三个矩形的所有摆放可能,横竖,2×2×2,8种可能
    for (x1, y1) in [(a1, b1), (b1, a1)]:
        for (x2, y2) in [(a2, b2), (b2, a2)]:
            for (x3, y3) in [(a3, b3), (b3, a3)]:
                # 情况1:三个矩形排成一排,高度一样,排成一个4条边的矩形
                if y1 == y2 == y3:
                    #重新赋值最小值为4
                    min_sides = min(min_sides, 4)
                else:
                    # 不等高则需要额外边封闭,当y1和y2的高度不一样,true=1,增加一条边长,y2和y3同理
                    sides = 2 * (1 + (y1 != y2) + (y2 != y3))
                    min_sides = min(min_sides, sides)

                # 情况2:两个并排 + 一个在下方拼接成矩形
                if x1 + x2 == x3 and y1 == y2 and y3 == y1:
                    min_sides = min(min_sides, 4)
                if x1 + x2 == x3 and y1 == y2:
                    if y3 == y1 + y2:
                        min_sides = min(min_sides, 4)
                    else:
                        min_sides = min(min_sides, 6)
                if x1 == x2 + x3 and y2 == y3 and y1 == y2:
                    min_sides = min(min_sides, 4)
    return min_sides


# 主程序:输入 + 输出
T = int(input())
for _ in range(T):
    a1, b1, a2, b2, a3, b3 = map(int, input().split())
    print(min_polygon_sides(a1, b1, a2, b2, a3, b3))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值