盒子(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"; }
}