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 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

程序代码:

    #include
    #include
    #include
    #include
    using namespace std;
    struct node
    {
        int w,h;
        bool operator <(const node& aa) const
        {
            if(w==aa.w) return ha[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;
    }

 

你可能感兴趣的:(基础算法)