问题描述
已知 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 。
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
思路:
三个矩形进行拼接,最终组成的边数仅包含 3 种情况:
1、4 条边,此时 3 个矩形可以组成 1 个大矩形,存在两种可能:
- 三个矩形存在一条长度相同的边,这样可以按照这条边组成大矩形
- 三个矩形中存在一个矩形等于另外两个矩形的边长之和,并且另外两个矩形的另一条边相同。
2、6 条边:
- 三个矩形中任意两个存在相同的边
- 三个矩形中存在一个矩形等于另外两个矩形的边长之和,并且另外两个矩形的另一条边不同。
3、8 条边,除去上面的所有情况。
这样我们可以轮流判断三个矩形,对于每个矩形的每条边进行逐一判断。
即第 i 个矩形的第 ii 条边、第 j 个矩形的第 jj 条边,第 k 个矩形的第 kk 条边对上述条件进行判断。
因此可以暴力使用 6 重循环,前三重循环枚举 i,j,k ,后三重循环枚举 ii,jj,kk ,最终每种情况根据上述进行分类讨论即可。
参考代码:
t=int(input())
while t>0:
t-=1
ans=8
a=list(map(int,input().split()))
a=[[a[0],a[1]],[a[2],a[3]],[a[4],a[5]]]
for i in range(3):
for j in range(3):
for k in range(3):
if i==j or i==k or j==k:
continue
for ii in range(2):
for jj in range(2):
for kk in range(2):
if a[i][ii]==a[j][jj]: #两条边相等
ans=min(ans,6)
if a[i][ii]==a[k][kk]: #三条边相等
ans=min(ans,4)
if a[i][ii]==a[j][jj]+a[k][kk]: #一条边等于两边之和
ans=min(ans,6)
if a[j][jj-1]==a[k][kk-1]: #一条边等于两边之和,且另外两边相等
ans=min(ans,4)
print(ans)