UVA-1587 紫书习题3-10盒子

大概题意:给定6个矩形的长和宽Wi和Hi,判断它们能否构成长方体的6个面。

题目要求:多组输入

Sample Input

1345 2584 
2584 683
2584 1345
683 1345
683 1345 
2584 683
1234 4567
1234 4567
4567 4321 
4322 4567 
4321 1234 
4321 1234

Sample Output

POSSIBLE

IMPOSSIBLE

本题思路:
长方体有三种不同的边,我们记为abc,并且记a>b>c,则长方体的六个面必定是ab、ab、ac、ac、bc、bc(按照边的长度排序),符合这种形式的就是一个长方体。
根据题目叙述,重点是怎样把输入的数据转化为这种标准形式,然后进行判断。
首先把每个面的两条边大小弄清楚,如ba转换为ab,即长>宽;
然后对六个面进行排序,按照长从大到小排序,长相同,按宽排序;
接下来进行判断,长方体含有“三对”面,并且一对面中的长或宽等于另一对面中的长或宽,符合条件的即为长方体。

即:先将每组数中的Wi和Hi 排序,然后再对整个数组进行排序,排序成如下样子后,然后再判断成立的条件即可。
设a<b<c
a  b
a  b
a  c
a  c
b  c
b  c

知识点:
1、关于本题的输入,本题输入要求多组输入告诉你每组输入的数量n,但并不输入数量n,同时也不告诉你输入结束的条件时采用下列方法:先输入第一组数,然后再在while循环中输入余下的数据。

 while(~scanf("%d%d",&a[0].w,&a[0].h))
 {
      for(int i=1;i<6;i++)
      {
           scanf("%d%d",&a[i].w,&a[i].h);
           ...
      }


2、因为Wi和Hi是一对数(类似坐标下x,y),所以采用结构体的类型。
3、在结构体中定义了重载运算符。重载'<',然后可以用sort函数对结构体数组进行排序。

struct node
{
    int w,h;
    bool operator <(const node& aa) const
    {
        if(w==aa.w) return h<aa.h;
        return w<aa.w;
    }
}a[10];

程序代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    struct node
    {
        int w,h;
        bool operator <(const node& aa) const
        {
            if(w==aa.w) return h<aa.h;
            return w<aa.w;
        }
    }a[10];
    bool ok()
    {
        if(a[0].w!=a[1].w||a[0].h!=a[1].h) return false;
        if(a[2].w!=a[3].w||a[2].h!=a[3].h) return false;
        if(a[4].w!=a[5].w||a[4].h!=a[5].h) return false;
        if(a[1].w!=a[2].w) return false;
        if(a[0].h!=a[4].w) return false;
        if(a[3].h!=a[5].h) return false;
        return true;
    }
    
    /*bool check()//这种用memcmp的方法也可以
    {
        if(memcmp(a, a+1, sizeof(face)) || memcmp(a+2, a+3, sizeof(face)) || memcmp(a+4, a+5, sizeof(face))) return false;
        if(a[0].x!=a[2].x || a[0].y!= a[4].x || a[2].y!=a[4].y) return false;
        return true;
    }*/
    int main()
    {
        while(~scanf("%d%d",&a[0].w,&a[0].h))
        {
            if(a[0].w>a[0].h)
                swap(a[0].w,a[0].h);
            for(int i=1;i<6;i++)
            {
                scanf("%d%d",&a[i].w,&a[i].h);
                if(a[i].w>a[i].h)
                    swap(a[i].w,a[i].h);
            }
            sort(a,a+6);
            if(ok()) printf("POSSIBLE\n");
            else printf("IMPOSSIBLE\n");
        }
        return 0;
    }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值