UVA1587

weixin_30924079發表於2020-04-04

題意很簡單,給六個面判斷是否能組成一個長方體。

教訓:這類考察思維而不是程式碼能力的(ACM基本都是這樣)題目,要基於題目特性去思考,善於發現物體的特徵,再根據特徵來寫解題方法。

思路:根據長方體特性,將其每個面的資料調整為長在前,寬在後,便於比較,而後根據長和寬來排序,如果兩個面長相等就看寬。排序後觀察,利用其資料特點來解題。

例:排序後3 2    3 2      3 1      3 1      2 1      2 1。

前四個面長相等,後四個面寬相等。前兩個面的寬是最後兩個面的長。

程式碼:

#include<bits/stdc++.h>
using namespace std;
struct box{
    int x,y;
}a[6];
bool cmp(const box a,const box b)
{
    return a.x==b.x?a.y>b.y:a.x>b.x;
}
int main()
{
    while(cin>>a[0].x>>a[0].y)
    {
        int ans=1;
        if(a[0].x<a[0].y)    swap(a[0].x,a[0].y);
        for(int i=1;i<6;i++)
        {
            cin>>a[i].x>>a[i].y;
            if(a[i].x<a[i].y)    swap(a[i].x,a[i].y);
        }
        sort(a,a+6,cmp);
        if(memcmp(a,a+1,sizeof(box))||memcmp(a+2,a+3,sizeof(box))||memcmp(a+4,a+5,sizeof(box)))//memcmp排序,按空間中字元比較,相等返回0. 
            ans=0;
        if(a[0].x!=a[2].x||a[2].y!=a[4].y||a[0].y!=a[4].x)
            ans=0;
        if(ans)    cout<<"POSSIBLE"<<endl;
        else    cout<<"IMPOSSIBLE"<<endl;
    }
    return 0;
}

 

轉載於:https://www.cnblogs.com/depth/p/5669243.html