题解:盒子(UVa 1587)

  1. 题目链接:https://vjudge.net/problem/UVA-1587
  2. 解题思路:
    假设有长方体:a=1 b=2 c=3 ,我们将六个面的数据进行二重排序,即先一个面上两条边从小到大排序,然后按照第一个数字从小到大排序可以得到:ab ab ac ac bc bc,为了叙述方便,分别标号为a[0]-a[5];其中的两个数据分别表示a[i].x和a[i].y;经观察不难发现,如果要满足构成盒子的条件,那么有:
    ①a[0].x==a[1].x==a[2].x==a[3].x&&a[4].x==a[5].x
    ②a[0].y==a[1].y&&a[2].y==a[3].y==a[4].y==a[5].y
    ③a[0].y==a[4].x //容易漏考虑,否则不能拼接成盒子(长方体)
  3. AC截图:
    题解:盒子(UVa 1587)_第1张图片
  4. AC代码:
#include
#include

struct node{
    int x,y;
}a[6];
int cmp(const void* a,const void* b){
    struct node* c=(struct node*)a;
    struct node* d=(struct node*)b;
    if(c->x!=d->x)return c->x-d->x;//默认递增顺序,否则反过来减法
    else return c->y-d->y;
} //C语言的qsort()函数的cmp部分编写,注意返回类型和类型转化
void swap(int &a,int &b){  //引用
    int temp;
    temp=a;a=b;b=temp;
}

int tell(){
    for(int i=1;i<4;i++)if(a[i].x!=a[0].x)return 0;
    if(a[4].x!=a[5].x)return 0;
    if(a[0].y!=a[1].y)return 0;
    for(int i=3;i<6;i++)if(a[i].y!=a[2].y)return 0;
    if(a[0].y!=a[4].x)return 0;//容易漏考虑; 
    return 1;
} //判断是否能构成盒子,分别对应思路分析中的①到③
int main(){
    while(~scanf("%d%d",&a[0].x,&a[0].y)){
        if(a[0].x>a[0].y)swap(a[0].x,a[0].y);//同一个结构体内部进行排序
        for(int i=1;i<6;i++){
            scanf("%d%d",&a[i].x,&a[i].y);
            if(a[i].x>a[i].y)swap(a[i].x,a[i].y);
        }
        qsort(a,6,sizeof(a[0]),cmp); //qsort()函数
        //for(int i=0;i<6;i++)printf("%d %d |",a[i].x,a[i].y);
        if(tell())printf("POSSIBLE\n");
        else printf("IMPOSSIBLE\n");
    }
}

以上代码也许还不是很好或者解释中含有错误,欢迎朋友交流和分享更优秀的代码或对错误进行指出。

你可能感兴趣的:(算法竞赛入门经典-第2版)