题目链接:https://vjudge.net/problem/UVA-1587
题解:判断6组边是否能构成长方体
需要满足两个条件:
1.六组边两两相对形成3组
2.三组边构成ab,ac,bc的形式
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int k,kk;
bool fl[6];
int test[6][2];//存储六祖边
int ans[6][2];//存储三对边
int main()
{
while(cin>>k)
{
int flag=0;
memset(fl,true,sizeof(fl));
test[0][0]=k;
cin>>kk;
test[0][1]=kk;
for(int i=1; i<6; i++)
for(int j=0; j<2; j++)
cin>>test[i][j];
for(int i=0; i<6; i++)
if(test[i][0]>test[i][1])
swap(test[i][0],test[i][1]);//将六组边由大到小排序
int cou=0;
for(int i=0; i<6; i++)//判断是否为3对
{
if(fl[i]==false)
continue;
for(int j=i+1; j<6; j++)
{
if(fl[j]==false)
continue;
if(test[i][0]==test[j][0]&&test[i][1]==test[j][1])
{
cou++;
ans[cou][0]=test[i][0];
ans[cou][1]=test[i][1];
fl[i]=false;
fl[j]=false;
break;
}
}
}
for(int i=0; i<6; i++)
if(fl[i]==true)
{
flag=1;
break;
}
if(flag==0)
{
int minn=2000000;
int a,b;//最小的两个边
for(int i=1; i<=3; i++)
if(ans[i][0]<minn)
minn=ans[i][0];//找最小值a
int f=0;
for(int j=1; j<=3; j++)
{
if(ans[j][0]==minn)
{
if(!f)
{
a=j;
f++;
}
else
{
b=j;
break;
}
}
}
int c=6-a-b;//第三边
if((ans[a][1]==ans[c][1]&&ans[b][1]==ans[c][0])||(ans[a][1]==ans[c][0]&&ans[b][1]==ans[c][1]));
else
flag=1;//构成ab,ac,bc的形式
}
if(flag==1)
cout<<"IMPOSSIBLE"<<endl;
else
cout<<"POSSIBLE"<<endl;
}
return 0;
}