矩形拼接
题目分析
对于一个矩形而言,我可以把它横着放,而可以把它竖着放,比如下图,
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;
}