题目描述
已知 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
解题思路
图片参考博文:蓝桥杯——矩形拼接_蓝桥杯矩形拼接-CSDN博客
三个矩形进行拼接,最终组成的边数仅包含 3 种情况:
1、4 条边,此时 3 个矩形可以组成 1 个大矩形,存在两种可能:
三个矩形存在一条长度相同的边,这样可以按照这条边组成大矩形
三个矩形中存在一个矩形等于另外两个矩形的边长之和,并且另外两个矩形的另一条边相同。
2、6 条边:
三个矩形中任意两个存在相同的边
三个矩形中存在一个矩形等于另外两个矩形的边长之和,并且另外两个矩形的另一条边不同。
3、8 条边,除去上面的所有情况。
这样我们可以轮流判断三个矩形,对于每个矩形的每条边进行逐一判断。
代码
t = int(input())
def check6(a,b,c):
if a+b==c or a+c==b or b+c==a:
return True
elif a==b or a==c or b ==c:
return True
else:
return False
def check4(a1,b1,a2,b2,a3,b3):
for i in [a1,b1]:
if i == a2+a3 and b2 == b3:
return True
elif i == a2 + b3 and b2 == a3:
return True
elif i == b2 + a3 and a2 ==b3:
return True
elif i == b2 + b3 and a2 == a3:
return True
elif i ==a2 and a2 ==a3:#三条边相等,4种
return True
elif i ==a2 and a2 ==b3:
return True
elif i ==b2 and b2 == a3:
return True
elif i == b2 and b2 == b3:
return True
for i in range(t):
s = list(map(int,input().split()))
ans = 8#因为边数有3这种情况,4(完美,有两边加起来等于另一边,另一边刚刚好相等,6(有两边加起来等于另一边,8(每个边都不等,任意两边加起来也不等第三边,
a1,b1,a2,b2,a3,b3 = s[0],s[1],s[2],s[3],s[4],s[5]
for i in range(0,2):
for j in range(2,4):
for k in range(4,6):
x1,x2,x3 = s[i],s[j],s[k]
if check6(x1,x2,x3):
ans = min(6,ans)
if check4(a1,b1,a2,b2,a3,b3):
ans = min(4,ans)
if check4(a2,b2,a1,b1,a3,b3):
ans = min(4,ans)
if check4(a3,b3,a1,b1,a2,b2):
ans = min(4,ans)
print(ans)