题解:盒子(UVa 1587)

来源:互联网 发布:阴司守门人网络剧资源 编辑:程序博客网 时间:2024/06/01 07:58
  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截图:
    这里写图片描述
  4. AC代码:
#include<stdio.h>#include<stdlib.h>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");    }}

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

0 0
原创粉丝点击