题目大意:
多组输入,每组输入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;
}