1587:Box

45 篇文章 0 订阅
44 篇文章 0 订阅
Box
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 4196 Accepted: 1518

Description

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. 

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 consists of six lines. Each line describes one pallet and contains two integer numbers w and h (1 <= w, h <= 10 000) -- width and height of the pallet in millimeters respectively.

Output

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 2584
2584 683
2584 1345
683 1345
683 1345
2584 683

Sample Output

POSSIBLE

Source


我的思路,将第一个面当做顶面,然后对于剩下五个面,确定是否有和顶面长宽均一样的面,即其对面;剩下四个面,找出他们的那条和顶面长宽均不相等的边,看看这四条边是否全部相等。两个条件都满足的话才是可以的。

代码

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 10000 + 5;
int main(){
    int l,w;
    while(scanf("%d %d",&l,&w) == 2){
        int ls[5],ws[5],tmp[5];
        int mark = 1,op = 0,first = 1,p,t;
        for(int i = 0;i < 5;i++){
            scanf("%d %d",&ls[i],&ws[i]);
            if(first && ((ls[i] == l && ws[i] == w) || (ls[i] == w && ws[i] == l))){
                p = i;
                op = 1;
                first = 0;
            }
            else if(ls[i] == l || ls[i] == w) tmp[i] = ws[i];
            else if(ws[i] == l || ws[i] == w) tmp[i] = ls[i];
            else mark = 0;
        }

        if(!op) mark = 0;
        first = 1;
        if(mark){
            for(int i = 0;i < 5;i++){
                if(i == p) continue;
                if(first > 0){
                    t = tmp[i];
                    first = 0;
                }
                if(tmp[i] != t){
                    mark = 0;
                    break;
                }
            }
        }
        if(mark) printf("POSSIBLE\n");
        else printf("IMPOSSIBLE\n");
    }
    return 0;
}

version 2:

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 10000 + 5;
int main(){
    int l,w;
    while(scanf("%d %d",&l,&w) == 2){
        int ls[5],ws[5],tmp[5];
        int mark = 1,op = 0,cnt = 0,first = 1;
        for(int i = 0;i < 5;i++){
            scanf("%d %d",&ls[i],&ws[i]);
            if(first && ((ls[i] == l && ws[i] == w) || (ls[i] == w && ws[i] == l))){
                op = 1;
                first = 0;
            }
            else if(ls[i] == l || ls[i] == w) tmp[cnt++] = ws[i];
            else if(ws[i] == l || ws[i] == w) tmp[cnt++] = ls[i];
            else mark = 0;
            if(cnt && tmp[cnt-1] != tmp[0]) mark = 0;
        }
        if(op && mark) printf("POSSIBLE\n");
        else printf("IMPOSSIBLE\n");
    }
    return 0;
}

version 3:

#include<cstdio>
using namespace std;
int main(){
    int l,w;
    while(scanf("%d %d",&l,&w) == 2){
        int tmp[4],mark = 1,op = 0,cnt = 0,a,b;
        for(int i = 0;i < 5;i++){
            scanf("%d %d",&a,&b);
            if(!op && ((a == l && b == w) || (a == w && b == l))) op = 1;
            else if(a == l || a == w) tmp[cnt++] = b;
            else if(b == l || b == w) tmp[cnt++] = a;
            else mark = 0;
            if(cnt && tmp[cnt-1] != tmp[0]) mark = 0;
        }
        if(op && mark) printf("POSSIBLE\n");
        else printf("IMPOSSIBLE\n");
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值