蓝桥杯——矩形拼接

矩形拼接

题目分析

对于一个矩形而言,我可以把它横着放,而可以把它竖着放,比如下图,

3个矩形的拼接情况可以通过在纸上画图模拟出来,情况有以下三种

​ 图1

图3是4条边,即四边形。观察一下什么时候会是四边形,假设先放下第一个矩形,如果后放的第二个矩形和第三个矩形横着的边长加起来恰好等于第一个矩形的边长,并且第二个矩形的竖着的边长和第三个矩形的竖着的边长恰好相等。

​ 图2

图2有6条边,即六边形。观察一下什么时候会是六边形,假设先放下第一个矩形,如果后放的第二个矩形和第三个矩形横着的边长加起来恰好等于第一个矩形的边长,但是第二个矩形的竖着的边长和第三个矩形的竖着的边长不恰好相等。

​ 图3

图1有8条边,即八边形。观察一下什么时候会是八边形,假设先放下第一个矩形,如果后放的第二个矩形和第三个矩形横着的边长加起来不恰好等于第一个矩形的边长,并且第二个矩形的竖着的边长和第三个矩形的竖着的边长不恰好相等。

//a[1][0]存的是第一个矩形的横向边长,a[1][1]存的是第一个矩形的竖向边长,
if(a[i][ii] == a[j][jj] + a[k][kk]){//这里i表示第1个矩形,j表示第2个矩形,k表示第3个矩形
    //ii,jj,kk是矩形的横向边长 
          ans = min(ans, 6);//如果第二个矩形和第三个矩形横着的边长加起来恰好等于第一个矩形的边长,那么至少能够拼成一个六边形
          if(a[j][1-jj] == a[k][1-kk])//此时,如果第二个矩形的竖着的边长和第三个矩形的竖着的边长恰好相等那么可以拼成一个四边形
          ans = min(ans, 4);
}

​ 图4

//如果第二个矩形和第三个矩形横着的边长加起来不恰好等于第一个矩形的边长,但是
if(a[i][ii] == a[j][jj] || a[j][jj] == a[k][kk])//如果第一个矩形和第二个矩形横着的边长相等,或者第二个矩形横着的边长和第三个矩形横着的边长相等,那么至少能够拼成一个六边形,如上图
      ans = min(ans, 6);

​ 图5

if(a[i][ii] == a[j][jj] && a[j][jj] == a[k][kk])//如果第一个矩形和第二个矩形横着的边长相等,并且第二个矩形横着的边长和第三个矩形横着的边长相等,那么可以拼成一个四边形
      ans = min(ans, 4);

下面的代码是依次遍历3个矩形,每个矩形作为上图1,2,3中的第一个矩形或者第二个矩形或者第三个矩形考虑

//a[0][0]存的是第一个矩形的横向边长,a[0][1]存的是第一个矩形的竖向边长,
//a[1][0]存的是第一个矩形的横向边长,a[1][1]存的是第一个矩形的竖向边长,
//a[2][0]存的是第一个矩形的横向边长,a[2][1]存的是第一个矩形的竖向边长,
for(int i = 0; i <= 2; i++)               //第1个矩形
        for(int j = 0; j < 3; j++)
            if(i != j)                       //第2个矩形
               for(int k = 0; k < 3; k++)
                   if(k != i && k != j)     //第3个矩形
题目代码
#include<bits/stdc++.h>
using namespace std;
int a[3][2];
int main(){
    int T;    cin >> T;
    while(T--)    {
        for(int i = 0; i < 3; i++)
            cin >> a[i][0] >> a[i][1];
        int ans = 8;
        for(int i = 0; i < 3; i++)               //第1个矩形
            for(int j = 0; j < 3; j++)
                if(i != j)                       //第2个矩形
                    for(int k = 0; k < 3; k++)
                        if(k != i && k != j)     //第3个矩形
                            for(int ii = 0; ii <= 1; ii++){           //第1个有横竖两种摆法
                                for(int jj = 0; jj <= 1; jj++){       //第2个横竖摆
                                    for(int kk = 0; kk <= 1; kk++){   //第3个横竖摆
                                        if(a[i][ii] == a[j][jj] + a[k][kk]){ 
                                            ans = min(ans, 6);
                                            if(a[j][1-jj] == a[k][1-kk])
                                                ans = min(ans, 4);
                                        }
                                        if(a[i][ii] == a[j][jj] || a[j][jj] == a[k][kk])
                                            ans = min(ans, 6);
                                        if(a[i][ii] == a[j][jj] && a[j][jj] == a[k][kk])
                                            ans = min(ans, 4);
                                    }
                                }
                            }
        cout<<ans<<endl;
    }
    return 0;
}
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值