1. 程式人生 > >UVA 1587 紫書習題3-10盒子

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