[1655] 木块拼接
时间限制: 1000 ms 内存限制: 65535 K
问题描述
好奇的skyv95想要做一个正方形的木块,现在有三种颜色的矩形木块,颜色分别为"A","B","C"。他现在很想把三个木块拼接成一个大正方形,现在求助于你们,问分别给你们三种颜色矩形的两个边长,判断是否能组成一个正方形。
输入
依次输入颜色为A的矩形的两边长度,颜色为B的矩形的两边长度,颜色为C的矩形的两边长度。
输出
可以输出"YES",否则输出"NO"。
样例输入
4 4 2 6 4 2样例输出
YES提示
例子的图像可以是这样 6 BBBBBB BBBBBB AAAACC AAAACC AAAACC AAAACC来源
By&Recoder
有两种情况,一种是三个并排,另一种是一个在上,然后下边的拼接,拼接的两个必须有一条边相等,并且相等的边加上上方的长方形短边等于长边
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int a,b;
}p[5];
int cmp(node s1,node s2)
{
if(s1.a==s2.a)
return s1.b>s2.b;
return s1.a>s2.a;
}
int main()
{
while(cin>>p[0].a>>p[0].b>>p[1].a>>p[1].b>>p[2].a>>p[2].b)
{
int flag=-1;
int maxx=-1,a=0,b=0;
for(int i=0;i<3;i++)
{
if(p[i].a>maxx||p[i].b>maxx)
{
maxx=max(p[i].a,p[i].b);
flag=i;
}
}
bool f=false;
int ans=0;
for(int i=0;i<3;i++)
{
if(p[i].a==maxx||p[i].b==maxx)
ans++;
if(p[i].a<p[i].b)
swap(p[i].a,p[i].b);
}
if(ans==3)
{
int sum=0;
for(int i=0;i<3;i++)
if(p[i].a==maxx)
sum+=p[i].b;
else
sum+=p[i].a;
if(sum==maxx)
f=true;
}
sort(p,p+3,cmp);
if(p[1].a==p[2].a&&p[1].a+min(p[0].a,p[0].b)==maxx)
f=true;
if(p[1].a==p[2].b&&p[1].a+min(p[0].a,p[0].b)==maxx)
f=true;
if(p[1].b==p[2].a&&p[1].b+min(p[0].a,p[0].b)==maxx)
f=true;
if(p[1].b==p[2].b&&p[1].b+min(p[0].a,p[0].b)==maxx)
f=true;
if(f)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}