UVa 1587 Box

题意:给出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   (第三个面)

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

 1 #include<iostream>  

 2 #include<cstdio>  

 3 #include<cstring>  

 4 #include<algorithm>  

 5 using namespace std;

 6 

 7 struct node

 8 {

 9     int x,y;

10 } a[10];

11 

12 int cmp(node n1,node n2)

13 {

14     if(n1.x!=n2.x)

15     return n1.x<n2.x;

16     else return n1.y<n2.y;

17 }

18 

19 int main()

20 {

21     int i,j,ans;

22     while(scanf("%d",&a[1].x)!=EOF)

23     {

24         scanf("%d",&a[1].y);

25         for(i=2;i<=6;i++)

26         scanf("%d %d",&a[i].x,&a[i].y);

27         

28         for(i=1;i<=6;i++)

29         {

30             if(a[i].x>a[i].y) swap(a[i].x,a[i].y);

31         }

32         sort(a+1,a+6+1,cmp);

33         

34     //    for(i=1;i<=6;i++)

35     //    printf("%d %d\n",a[i].x,a[i].y);

36     

37         ans=0;

38         int flag=1;

39         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)

40         {

41             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++;

42             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++;

43             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++;

44             if(ans<3) flag=0;

45             

46         }

47         else

48         flag=0;

49         

50         if(flag) printf("POSSIBLE\n");

51         else printf("IMPOSSIBLE\n");        

52     }

53     return 0;

54 }
View Code

 

 

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

12 34

34 12

12 34

34 12

12 34

12 34

这应该不能构成吧--可是程序输出的是能 ----不懂= =

你可能感兴趣的:(uva)