box-acm
//这题我是转载的,思想很不错 原文出处如下
http://blog.csdn.net/u011497948/article/details/48735993
//我自己的理解
#include<cstdio>
#include<algorithm>
using namespace std;
const int C = 10001;
int p[7];
void swap(int &x, int &y)
{
int t = x;
x = y;
y = t;
}
int x, y;
int main()
{
while (scanf("%d%d", &x, &y) == 2)
{
if (x>y)swap(x, y);
p[0] = x*C + y;
for (int i = 1; i <= 5; i++)
{
scanf("%d%d", &x, &y);
if (x>y)swap(x, y);
p[i] = x*C + y;
}
sort(p, p + 6);
bool f = false;
if (p[0] == p[1] && p[2] == p[3] && p[4] == p[5])
{
if (p[0] / C == p[2] / C)
{
if ((p[0] % C == p[4] / C&&p[2] % C == p[4] % C) || (p[0] % C == p[4] % C&&p[2] % C == p[4] / C))
{
printf("POSSIBLE\n");
f = true;
}
}
}
if (!f)printf("IMPOSSIBLE\n");
}
return 0;
}
//但是我觉得原作者的代码还可以进行改进
if ((p[0] % C == p[4] / C&&p[2] % C == p[4] % C) || (p[0] % C == p[4] % C&&p[2] % C == p[4] / C))
可以改成 if ((p[0] % C == p[4] / C&&p[2] % C == p[4] % C) )
解释
若构成立方体长宽高的三个值可能为 a b c
不妨假设 a<=b<=c
则进行完sort函数之后排序p中携带的数据排序一定为
a b (p[0],p[1])
a c (p[2],p[3])
b c (p[4],p[5])
则此时只需要检验三组对应的值是否相等即可(我认为位置已经 绝对确定)