您的位置:首页 > 其它

UVa 1587 Box

2015-03-01 20:32 176 查看
题意:给出6个矩形的长和宽,问是否能够构成一个长方体

先假设一个例子

2 3

3 4

2 3

3 4

4 2

4 2

排序后

2 3

2 3

3 4

3 4

4 2

4 2

如果要构成一个长方体的话,有3对面是一样的 先判断这个成立了,再判断能否构成长方体 假设现在剩下的面就为

2 3 (第一个面)

3 4 (第二个面)

4 2 (第三个面)

发现是首尾相接的,即为只需要判断三次,第一个面的长或者宽或者两者都在第二个面出现,第一个面的长或者宽或者两者都在第三个面出现,第二个面的长或者宽或者两者都在第三个面出现,如果三个条件都满足的话,就构成了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct node
{
int x,y;
} a[10];

int cmp(node n1,node n2)
{
if(n1.x!=n2.x)
return n1.x<n2.x;
else return n1.y<n2.y;
}

int main()
{
int i,j,ans;
while(scanf("%d",&a[1].x)!=EOF)
{
scanf("%d",&a[1].y);
for(i=2;i<=6;i++)
scanf("%d %d",&a[i].x,&a[i].y);

for(i=1;i<=6;i++)
{
if(a[i].x>a[i].y) swap(a[i].x,a[i].y);
}
sort(a+1,a+6+1,cmp);

//    for(i=1;i<=6;i++)
//    printf("%d %d\n",a[i].x,a[i].y);

ans=0;
int flag=1;
if(a[1].x==a[2].x&&a[1].y==a[2].y&&a[3].x==a[4].x&&a[3].y==a[4].y&&a[5].x==a[6].x&&a[5].y==a[6].y)
{
if(a[1].x==a[3].x||a[1].x==a[3].y||a[1].y==a[3].x||a[1].y==a[3].y) ans++;
if(a[1].x==a[5].x||a[1].x==a[5].y||a[1].y==a[5].x||a[1].y==a[5].y) ans++;
if(a[3].x==a[5].x||a[3].x==a[5].y||a[3].y==a[5].x||a[3].y==a[5].y) ans++;
if(ans<3) flag=0;

}
else
flag=0;

if(flag) printf("POSSIBLE\n");
else printf("IMPOSSIBLE\n");
}
return 0;
}


View Code

不过后来又想到一个反例= =正想着改的时候---居然 过了= = 反例是

12 34

34 12

12 34

34 12

12 34

12 34

这应该不能构成吧--可是程序输出的是能 ----不懂= =
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: