NBUT 1665

Description

好奇的skyv95想要做一个正方形的木块,现在有三种颜色的矩形木块,颜色分别为"A","B","C"。他现在很想把三个木块拼接成一个大正方形,现在求助于你们,问分别给你们三种颜色矩形的两个边长,判断是否能组成一个正方形。

Input

依次输入颜色为A的矩形的两边长度,颜色为B的矩形的两边长度,颜色为C的矩形的两边长度。

Output

可以输出"YES",否则输出"NO"。

Sample Input

4 4 2 6 4 2

Sample Output

YES

Hint

例子的图像可以是这样
6
BBBBBB
BBBBBB
AAAACC
AAAACC
AAAACC
AAAACC
主要分两种情况,看似比较简单的数学题,但做起来比较麻烦,

分两种情况,第一种三个矩形的长都等于拼成正方形的边,这一种比较简单,第二种比较复杂,只有一个矩形的长或宽等于正方形的边长,主要在于另外两个矩形的长或宽加这个矩形的长和宽 一定等于正方形的边长
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int a[10],ans,i,j,k,l;
int main()
{
	while(scanf("%d",&a[0])!=EOF)
	{
		int help=0;
		l=0;
		ans=0;
		for(i=1;i<6;i++)
		scanf("%d",&a[i]);
		for(i=0;i<3;i++)
		ans+=a[i*2]*a[2*i+1];
		k=sqrt(ans);//先求出边长 
		if(k*k!=ans)
		{
			printf("NO\n");
			continue;
		}
		for(i=0;i<6;i++)
		{
			if(a[i]>k)
			help=1;//如果有一条边的长度大于边长,那么肯定不行 
			l=max(a[i],l);//找到最长的边 
		}
		if(l!=k)//如果最长的边大于了边长,这一句可以不写 
		help=1;
		j=0;//找到 长度等于边长的边的个数 
		for(i=0;i<6;i++)
		if(a[i]==l)
		j++;
		if(j==2)//如果 长度为边长的边的个数为2   那么肯定不行 
		help=1;
		if(j==3)//如果有3 个 为情况1 ,因为原来已经算过正方形的面积,所以此时一定满足 
		{
			printf("YES\n");
			continue;
		}
		if(help==1)
		{
			printf("NO\n");
			continue;
		}
		int cnt;
		if(j==1)//如果有1 个  为情况2 
		{
			for(i=0;i<6;i++)
			if(a[i]==l)
			cnt=i;
		}
		int nmd;
		int flag=0;
		if(cnt%2==0) //这个是确定  等于边长的那条边的第几个矩形的长还是宽
		 //如果是长 
		nmd=cnt+1;
		//如果是宽 
		if(cnt%2==1)
		nmd=cnt-1;
		for(i=0;i<3;i++)
		{
			if(i*2==cnt||i*2+1==cnt)//判断另外两个矩形的长或宽加这个矩形那个不等于边长的边 是否为正方形的边 
			continue;
			if(a[i*2]+a[nmd]==l) 
			flag=1;
			if(a[i*2+1]+a[nmd]==l)
			flag=1;
			}
		if(flag==1)
		{
			printf("YES\n");
			continue;
		}
	}
}


你可能感兴趣的:(NBUT 1665)