Python:《矩形拼接》真题练习

问题描述

已知 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)
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的敲码工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值