#include<stdio.h> #include<string.h> #include<ctype.h> #include<math.h> #include<iostream> #include<string> #include<set> #include<map> #include<vector> #include<queue> #include<bitset> #include<algorithm> #include<time.h> using namespace std; void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);} #define MS(x,y) memset(x,y,sizeof(x)) #define MC(x,y) memcpy(x,y,sizeof(x)) #define MP(x,y) make_pair(x,y) #define ls o<<1 #define rs o<<1|1 typedef long long LL; typedef unsigned long long UL; typedef unsigned int UI; template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;} template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;} const int N=0,M=0,Z=1e9+7,ms63=1061109567; int casenum,casei; int a[4][2]; int b[4]; bool check(int x,int y,int z) { for(int i=0;i<2;i++) { for(int j=0;j<2;j++) { for(int k=0;k<2;k++) { if(a[x][i]==a[y][j]&&a[x][i]==a[z][k])return 1; if(a[x][i]==a[y][j]+a[z][k]&&a[y][j^1]==a[z][k^1])return 1; } } } return 0; } int main() { scanf("%d",&casenum); for(casei=1;casei<=casenum;casei++) { for(int i=0;i<4;i++)scanf("%d%d",&a[i][0],&a[i][1]); bool flag=0; for(int i=0;i<4;i++)b[i]=i; do{ if(check(b[0],b[1],b[2])){flag=1;break;} }while(next_permutation(b,b+4)); puts(flag?"Yes":"No"); } return 0; } /* 【trick&&吐槽】 HDU7队竟然被这题卡了3个多小时然后打铁=.= 他们平时做比赛还是有铜~银的实力的…… 可见读题的重要性 【题意】 给你四个矩形,让你选出三个,并判断这三个矩形是否能恰好构成一个大的矩形 【类型】 模拟 【分析】 第一种构造法:左中右,即1*3 第二种构造法:左+(卡) 两种方法搞一下即可。 简化写法更好写更方便哦~ */
下面是笨拙一点的写法——
#include<stdio.h> #include<string.h> #include<ctype.h> #include<math.h> #include<iostream> #include<string> #include<set> #include<map> #include<vector> #include<queue> #include<bitset> #include<algorithm> #include<time.h> using namespace std; void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);} #define MS(x,y) memset(x,y,sizeof(x)) #define MC(x,y) memcpy(x,y,sizeof(x)) #define MP(x,y) make_pair(x,y) #define ls o<<1 #define rs o<<1|1 typedef long long LL; typedef unsigned long long UL; typedef unsigned int UI; template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;} template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;} const int N=0,M=0,Z=1e9+7,ms63=1061109567; int casenum,casei; struct A { int h,w; }a[4]; bool ok(int len,A a,A b) { if(len==a.h+b.h&&a.w==b.w)return 1; if(len==a.h+b.w&&a.w==b.h)return 1; if(len==a.w+b.h&&a.h==b.w)return 1; if(len==a.w+b.w&&a.h==b.h)return 1; return 0; } bool check(A a,A b,A c) { //第一种构造法:左中右,即1*3 if(a.h==b.h&&a.h==c.h)return 1; if(a.h==b.h&&a.h==c.w)return 1; if(a.h==b.w&&a.h==c.h)return 1; if(a.h==b.w&&a.h==c.w)return 1; if(a.w==b.h&&a.w==c.h)return 1; if(a.w==b.h&&a.w==c.w)return 1; if(a.w==b.w&&a.w==c.h)return 1; if(a.w==b.w&&a.w==c.w)return 1; //第二种构造法:左+(卡) if(ok(a.h,b,c))return 1; if(ok(a.w,b,c))return 1; if(ok(b.h,a,c))return 1; if(ok(b.w,a,c))return 1; if(ok(c.h,a,b))return 1; if(ok(c.w,a,b))return 1; return 0; } int main() { scanf("%d",&casenum); for(casei=1;casei<=casenum;casei++) { for(int i=0;i<4;i++)scanf("%d%d",&a[i].h,&a[i].w); puts(check(a[1],a[2],a[3]) ||check(a[0],a[2],a[3]) ||check(a[0],a[1],a[3]) ||check(a[0],a[1],a[2]) ?"Yes":"No"); } return 0; } /* 【trick&&吐槽】 HDU7队竟然被这题卡了3个多小时然后打铁=.= 他们平时做比赛还是有铜~银的实力的…… 可见读题的重要性 【题意】 给你四个矩形,让你选出三个,并判断这三个矩形是否能恰好构成一个大的矩形 【类型】 模拟 【分析】 第一种构造法:左中右,即1*3 第二种构造法:左+(卡) 两种方法搞一下即可。 */