【UVA-1587】Box【排序】【紫书】

【UVA-1587】Box【排序】【紫书】

问题链接:https://vjudge.net/problem/UVA-1587

Solution:

一道十分典型的排序解决的问题。大致思路就是,如果我们将假设拼成的长方体的朝向确定下来,那么只需要判断一下对面相同以及邻边可接就好(朝向确定下来后就可以找到唯一的衡量邻边是否可接的办法了)。所以关键就是排序,构造一种有序的方式:每个面有两个数据成员,w和l,让w始终是小的那个,之后在根据w优先、l次之从小到大进行排序,接着判断就好。

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

struct Plane {
    int w, l;
    bool operator < (const Plane & p) const {
        if (w != p.w) return w < p.w;
        return l < p.l;
    }
    bool operator == (const Plane & p) const {
        return w == p.w && l == p.l;
    }
    void format() {
        if (w > l) {
            int tmp = w;
            w = l;
            l = tmp;
        }
    }
};

int main(void) {
    ios::sync_with_stdio(false);
    Plane tmp;
    while (cin >> tmp.w >> tmp.l) {
        /* load the data */
        vector<Plane> data;
        tmp.format();
        data.push_back(tmp);
        for (int i = 1; i < 6; i++) {
            cin >> tmp.w >> tmp.l;
            tmp.format();
            data.push_back(tmp);
        }
        /* sort the data */
        sort(data.begin(), data.end());

        bool flag;
        /* parallel plane */
        flag = data[0] == data[1] && data[2] == data[3] && data[4] == data[5];
        if (!flag) {
            cout << "IMPOSSIBLE" << endl;
            continue;
        }
        /* adjacent plane */
        flag = data[0].w == data[2].w && data[2].l == data[4].l && data[0].l == data[4].w;
        cout << (flag ? "POSSIBLE" : "IMPOSSIBLE") << endl;
    }
    return 0;
}