UVA 1587

在这里插入图片描述在这里插入图片描述

题目大意:

多组输入,每组输入6个a b 表示有a x b 大小的长方形,询问这6个能否拼成长方体。

解题思路:

这道题是我想多了,刚开始又想正方体。。不规则长方体。。之类的,最后发现就一正常的长方体,这道题很好理解,但是想AC需要把所有情况都考虑全。我们先输入这6个长方形,然后让a始终<=b,用pair存一下。输入完之后按照 a 升序排一下序,如果a相同则b升序,我们考虑这样一组样例(3 4)(3 4)(3 5)(3 5)(4 5)(4 5)这是能组成长方体的,然后我们考虑几个组成长方体的条件:

3 4
3 4
3 5
3 5
4 5
4 5

  • 每个边出现次数一定是4的倍数
  • 一定有3对彼此相等的pair
  • 第一个短边一定等于第三个的短边
  • 第一个的长边一定等于第五个的短边
  • 第三个的长边一定等于第五个的长边
    第一次遇到这种多组输入一次输多个的题…学到了这种输入方式。
    AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
int x,y;
typedef pair<int ,int> pii;
int mp[15000];
pii p[10];
bool cmp(pii a,pii b)//定义pair的排序方式
{
	if(a.first==b.first)
	  return a.second<b.second;
	return a.first<b.first;
}
bool check()
{
	if(mp[p[1].first]%4||mp[p[1].second]%4||mp[p[6].second]%4)//先判3边是否为4的倍数
	  return false;
	if(p[1]!=p[2]||p[3]!=p[4]||p[5]!=p[6])//判两两相等
	  return false;
	if(p[1].first!=p[3].first||p[1].second!=p[6].first||p[3].second!=p[6].second)//判边边相等
	  return false;
	return true;
}
int main()
{
	while(true)//输入方式
	{
		for(int i=1;i<=6;i++)
		{
			if(!(cin>>x>>y)) return 0;//一直到文件结束
			if(x>y)
		 	swap(x,y);
			p[i]={x,y};
			mp[x]++;
			mp[y]++;
		}
		sort(p+1,p+7,cmp);
		cout<<(check()?"POSSIBLE":"IMPOSSIBLE")<<endl;//检查是否合格
		memset(mp,0,sizeof mp);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/Hayasaka/p/14294229.html