题目 2681:矩形拼接
题目描述:
已知 3 个矩形的大小依次是 a1 × b1, a2 × b2 和 a3 × b3。用这 3 个矩形能拼出的所有多边形中,边数最少可以是多少?例如用 3 × 2 的矩形(用 A 表示)、4 × 1 的矩形(用 B 表示)和 2 × 4 的矩形(用 C 表示)可以拼出如下 4 边形。
例如用 3 × 2 的矩形(用 A 表示)、3 × 1 的矩形(用 B 表示)和 1 × 1 的矩形(用 C 表示)可以拼出如下 6 边形。
输入格式:
输入包含多组数据。
第一行包含一个整数 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))