UVA - 1587 Box

来源:互联网 发布:矩阵的迹有什么用 编辑:程序博客网 时间:2024/05/01 22:32
Ivan works at a factory that produces heavy machinery. He has a simple job -- he knocks up wooden boxes of different sizes to pack machinery for delivery to the customers. Each box is a rectangular parallelepiped. Ivan uses six rectangular wooden pallets to make a box. Each pallet is used for one side of the box.
\epsfbox{p3214.eps}
Joe delivers pallets for Ivan. Joe is not very smart and often makes mistakes -- he brings Ivan pallets that do not fit together to make a box. But Joe does not trust Ivan. It always takes a lot of time to explain Joe that he has made a mistake. Fortunately, Joe adores everything related to computers and sincerely believes that computers never make mistakes. Ivan has decided to use this for his own advantage. Ivan asks you to write a program that given sizes of six rectangular pallets tells whether it is possible to make a box out of them.

Input 

Input file contains several test cases. Each of them consists of six lines. Each line describes one pallet and contains two integer numbers wand h ( 1$ \le$wh$ \le$10 000) -- width and height of the pallet in millimeters respectively.

Output 

For each test case, print one output line. Write a single word ` POSSIBLE' to the output file if it is possible to make a box using six given pallets for its sides. Write a single word ` IMPOSSIBLE' if it is not possible to do so.

Sample Input 

1345 25842584 6832584 1345683 1345683 13452584 6831234 45671234 45674567 43214322 45674321 12344321 1234

Sample Output 

POSSIBLE

IMPOSSIBLE

解题思路: 把w和h作比较,然后w是小的,h是大的,排好一级排序后,按照6个面来排序,排好之后如果是possible,就会有0==1的面,2==3的面,4==5的面,取出不同的3个面,然后进行宽高是否相等。

#include <iostream>#include <cstdio>#include <algorithm>#define MAXD 10using namespace std;struct M{    int w;    int h;}rectangular[MAXD];//比较交换bool cmp(M m,M n){    if(m.w > n.w) return true;    if(m.w < n.w) return false;    if(m.h > n.h) return true;    else return false;}//判断是否能构造长方体bool solve(){    M ans[MAXD];    int m = 0;    for(int i = 0; i < 6 ; i+=2){        if(rectangular[i].w==rectangular[i+1].w && rectangular[i].h==rectangular[i+1].h)            ans[m] = rectangular[i],m++;        else return false;    }    if (rectangular[0].h==rectangular[2].h && rectangular[0].w==rectangular[4].h && rectangular[2].w==rectangular[4].w)        return true;    else return false;}void exchange(int i){ //宽高交换    int temp = rectangular[i].w;    rectangular[i].w = rectangular[i].h;    rectangular[i].h = temp;}int main(){   //一级排序是宽高排序    while(scanf("%d",&rectangular[0].w) != EOF){        scanf("%d",&rectangular[0].h);        if(rectangular[0].w > rectangular[0].h) exchange(0);        for(int i = 1; i < 6 ; i++){            scanf("%d%d",&rectangular[i].w,&rectangular[i].h);            if(rectangular[i].w > rectangular[i].h) exchange(i);        }        sort(rectangular,rectangular+6,cmp);//二级排序把面排序        bool ok = solve();        ok? printf("POSSIBLE\n"):printf("IMPOSSIBLE\n");    }}




0 0
原创粉丝点击