思路:算是找规律吧
按照一定规则重新排列六个面 详情见代码 比如 样例一
初始状态
1345 2584
2584 683
2584 1345
683 1345
683 1345
2584 683
排列后状态
683 1345
683 1345
683 2584
683 2584
1345 2584
1345 2584
首先比较前两个面 如果相等 则判断接下来的四个面是否有共同的高 如果有 再判断 其余四个面是否与已确定的两个面具有共同的长和宽
683 1345
2584 683
排列后状态
683 1345
683 1345
683 2584
683 2584
1345 2584
1345 2584
首先比较前两个面 如果相等 则判断接下来的四个面是否有共同的高 如果有 再判断 其余四个面是否与已确定的两个面具有共同的长和宽
//#define LOCAL
#include <map>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
struct Node{
int l;
int w;
};
bool Cmp( const Node &a, const Node &b ){
if(a.w==b.w) return a.l<b.l;
return a.w<b.w;
}
int main()
{
#ifdef LOCAL
freopen("in1.txt","r",stdin);
#endif
int brk;
Node node;
vector<Node>vec;
while(~scanf("%d %d",&node.w,&node.l)){
brk=0;
vec.clear();
if(node.w>node.l) swap(node.w,node.l);
vec.push_back(node);
for(int i=0; i<5; i++){
scanf("%d %d",&node.w,&node.l);
if(node.w>node.l) swap(node.w,node.l);
vec.push_back(node);
}
sort(vec.begin(),vec.end(),Cmp);
// for(int i=0; i<6; i++){
// cout<<vec[i].w<<" "<<vec[i].l<<endl;
// }
if(vec[0].w!=vec[1].w || vec[0].l!=vec[1].l){
brk=1;
}
else{
if( vec[2].l!=vec[3].l || vec[2].l!=vec[4].l || vec[2].l!=vec[5].l ) brk=1;
else{
if (vec[2].w!=vec[0].w || vec[3].w!=vec[0].w) brk=1;
if (vec[4].w!=vec[0].l || vec[5].w!=vec[0].l) brk=1;
}
}
if(brk) printf("IMPOSSIBLE\n");
else printf("POSSIBLE\n");
}
return 0;
}