uva1587 box(盒子)

  • 题目链接
  • 思路:

1. 立方体具有以下特点:

(1) 12条棱长的种类数 <= 3 (正方体边的种类数为1)

(2) 6个面的种类数 <= 3 (正方体面的种类数为1)

(3) 相对的两个面, 长和宽是对应相等的

(4) 已知其中两个种类的面, 可以推出第3类面的长和宽

uva1587 box(盒子)_第1张图片

 

就这个案例来说, 我们可以将它每个面排序(保证每个面 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 
#include 
#include 
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 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")<

 

你可能感兴趣的:(UVA)