盒子(Box, UVa1587)

题目:

给定6个矩形的长和宽wi 和 hi(1<=wi, hi<=1000),判断它们是否构成长方体的6个面。

分析

如果一组数据能构成长方体,则6个面满足:

a, b

a, b

a, c

a, c

b, c

b, c

其中 a<=b <= c

如果把输入的数据排序之后,很容易进行判断,即 1, 2组,3,4组,5,6 组分别相等。

且1,3的x相等,2,4的y相等,1组的y与5组的x相等。

c实现

#include<stdio.h>

//定义结构体存储宽高 
struct pallet{
    int x;
    int y;
}pallet[6];

//交换数据 
void swap(int *a,int *b){
    int t=*a;
    *a = *b;
    *b = t;
}
//对6个面排序,按 a,b; a,b; a,c; a,c; b,c;b,c; 总体为a<b<c 
void sort(){
    for(int i=5;i>=0;i--){
        for(int j=0;j<i;j++){
            if(pallet[j].x>pallet[j+1].x){
                swap(&pallet[j].x,&pallet[j+1].x);
                swap(&pallet[j].y,&pallet[j+1].y);
            }else if(pallet[j].x==pallet[j+1].x && pallet[j].y>pallet[j+1].y){
                swap(&pallet[j].x, &pallet[j+1].x);
                swap(&pallet[j].y,&pallet[j+1].y);
            }
        }
    }    
}
//检验如果满足如下条件,则impossible 
int check(){
    if(pallet[0].x== pallet[1].x && pallet[0].y==pallet[1].y
     && pallet[2].x==pallet[3].x && pallet[2].y == pallet[3].y
     && pallet[4].x == pallet[5].x && pallet[4].y == pallet[5].y
     && pallet[0].x == pallet[2].x && pallet[2].y == pallet[4].y
     && pallet[0].y == pallet[4].x){
         return 1;
     }
     return 0;
}

int main()
{
    while(scanf("%d%d",&pallet[0].x, &pallet[0].y)==2){
        //保证 x< y 
        if(pallet[0].x > pallet[0].y){
            swap(&pallet[0].x,&pallet[0].y);
        }
        for(int i=1;i<6;i++){
            scanf("%d%d",&pallet[i].x,&pallet[i].y);
            if(pallet[i].x>pallet[i].y){
                swap(&pallet[i].x,&pallet[i].y);
            }
        }
        sort();
        
        if(check()){
            printf("POSSIBLE
");
        }else{
            printf("IMPOSSIBLE
");
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Vincent-yuan/p/13028190.html