盒子(Box,ACM/ICPC NEERC 2004,UVa1587)
题目描述:
给出6个木条的长和宽,判断用这些木条能否组成长方体。能,输出POSSIBLE;否则输出IMPOSSIBLE。
思路详解:
先是在输入数据的时候就先对其作出处理,保证x<y;
再是对存储在结构体中的数据排序。
如果x相同,则按照y的值从小到大排序;否则按照x的值从小到大排序。
长方体有三个“对面”,排好序后,直接判断一下“对面”的长宽是否相等,用flag做列标记。
也就是 判断一对面中的长或宽等于另一对面中的长或宽 。
以第一组数据为例:
1345 2584
2584 683
2584 1345
683 1345
683 1345
2584 683
排序之后:
0 683 1345
1 683 1345
2 683 2584
3 683 2584
4 1345 2584
5 1345 2584
代码:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
struct mp{
int x,y;
} ;
bool cmp(mp a,mp b)
{
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
int main()
{
int a,b;
while(cin>>a>>b)
{
if(a>b)swap(a,b);
mp d[7];
d[0].x=a;d[0].y=b;
for(int i=1;i<6;i++)
{
cin>>a>>b;
if(a>b)swap(a,b);
d[i].x=a;d[i].y=b;
}
//先是在输入数据的时候就先对其作出处理,保证x<y;
//再是对存储在结构体中的数据排序。
//如果x相同,则按照y的值从小到大排序;否则按照x的值从小到大排序。
sort(d,d+6,cmp);
int flag=1;
//长方体有三个“对面”,排好序后,直接判断一下“对面”的长宽是否相等,用flag做列标记
for(int i=0;i<6;i+=2)
{
if(d[i].x!=d[i+1].x||d[i].y!=d[i+1].y)
flag=0;
}
if(flag==1){
//判断一对面中的长或宽等于另一对面中的长或宽
if(d[0].x!=d[2].x||d[0].y!=d[4].x||d[2].y!=d[4].y)
flag=0;
}
if(flag==1)cout<<"POSSIBLE\n";
else cout<<"IMPOSSIBLE\n";
}
}