- 题目链接
- 思路:
1. 立方体具有以下特点:
(1) 12条棱长的种类数 <= 3 (正方体边的种类数为1)
(2) 6个面的种类数 <= 3 (正方体面的种类数为1)
(3) 相对的两个面, 长和宽是对应相等的
(4) 已知其中两个种类的面, 可以推出第3类面的长和宽
就这个案例来说, 我们可以将它每个面排序(保证每个面 a < b)
a b
683 1345
683 1345
683 2584
683 2584
1345 2584
1345 2584
我们可以发现:
面的种类数为3, 边的种类数为3
面0 == 面1 面2 == 面3 面4 == 面5
第一类面: 683 1345
第二类面: 683 2584
可以推出第三类面: 1345 2584
2. 我们可以按照以上性质来判断, AC代码如下:
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
struct rect // 长方体的面, 默认a <= b
{
int a;
int b;
};
bool operator==(rect &r1, rect &r2) //判断两个矩形是否完全相等
{
return (r1.a == r2.a) && (r1.b == r2.b);
}
int cmp(const rect &r1, const rect &r2) //排序
{
return (r1.a != r2.a)?(r1.a < r2.a):(r1.b < r2.b);
}
int main(int argc, char *argv[])
{
int x, y;
set<int> s; //用来判断棱长的长度类别<=3
rect rectArr[6];
int n = 0;
int b;
while(cin>>x>>y)
{
b = 1;
s.insert(x); s.insert(y);
rectArr[n].a = min(x,y); rectArr[n++].b = max(x,y);
if(n == 6)
{
sort(rectArr, rectArr+6, cmp);
for(int i = 0; i < 6; i+=2)
{
if(!(rectArr[i] == rectArr[i+1]) || s.size() > 3)
{
b = 0;
break;
}
}
if(b)
{
rect r; //推出的第三类面
r.a = rectArr[0].b; //r.a一定不大于r.b
r.b = rectArr[2].b;
cout<<((r == rectArr[4])?"POSSIBLE":"IMPOSSIBLE")<<endl;
}
else
cout<<"IMPOSSIBLE"<<endl;
n = 0;
s.clear();
}
}
return 0;
}