UVa1587 - Box 题解

题目

题目链接

UVa1587 - Box

题目大意

给你6个长方形,请写个程序判断这个6个长方形能否拼成一个长方体。

输入由多组数据组成,每组数据包含6行,每行包含2个数字表示长方形的长和宽。

对于每组测试数据,输出'POSSIBLE'或者'IMPOSSIBLE'。

输入样例

1345 2584
2584 683
2584 1345
683 1345
683 1345
2584 683
1234 4567
1234 4567
4567 4321
4322 4567
4321 1234
4321 1234

输出样例

POSSIBLE
IMPOSSIBLE

题解

首先感谢nustart0720的博文给我的思路。博文链接:题解:盒子(UVa 1587)

假设现在有一个数组rec[6]存放着长方形,rec[i].x, rec[i].y分别为第i个长方形的长和宽。

现在我们通过排序让rec[i].x <= rec[i].y, 然后再以x,y为第一第二排序标准,从小到大排序长方形。

那么长方体的6个面可能成这个形式(假设边长a <= b <= c): ab ab ac ac bc bc

我们能从ab ab ac ac bc bc中看出来:

  1. 前4个面的宽是相等的,后2个面的宽是相等的。
  2. 前2个面的长是相等的,后4个面的长是相等的。
  3. 前2个面的长与后2个面的宽相等。

根据上面的3个规则,就能够编写程序判断6个长方形能否组成真正的长方体。

Then show the code.

#include <stdio.h>
#include <stdlib.h>

struct node{
    int x, y;
} rec[6];

int cmp(const void *a, const void *b){
    node *a1 = (node *)a;
    node *b1 = (node *)b;
    if(a1->x == b1->x)
        return a1->y - b1->y;
    else 
        return a1->x - b1->x;
}

int swapxy(int &a, int &b){
    int temp;
    temp = a; a = b; b = temp;
    return 0;
}

int tell(){
    for(int i=1; i<4; i++){
        //确保前4个面的宽相等
        if(rec[i].x != rec[0].x) return 0;
        //确保后4个面的长相等
        if(rec[5-i].y != rec[5].y) return 0;
    }
    //确保后2个面的宽相等
    if(rec[4].x != rec[5].x) return 0;
    //确保前2个面的长相等
    if(rec[0].y != rec[1].y) return 0;
    //确保前2个面的长和后4个面的宽相等
    if(rec[0].y != rec[5].x) return 0;
    return 1;
}

int main(){
    while(scanf("%d%d", &rec[0].x, &rec[0].y) != EOF){
        //让每个结构体内部 x <= y
        if(rec[0].x > rec[0].y)
            swapxy(rec[0].x, rec[0].y);
        for(int i=1; i<6; i++){
            scanf("%d%d", &rec[i].x, &rec[i].y);
            if(rec[i].x > rec[i].y)
                swapxy(rec[i].x, rec[i].y);
        }
        //让长方形按照边长从小到大排序
        qsort(rec, 6, sizeof(rec[0]), cmp);
        if(tell()) printf("POSSIBLE\n");
        else printf("IMPOSSIBLE\n");
    }
    return 0;
}
posted @ 2020-11-10 17:05  1v7w  阅读(128)  评论(0编辑  收藏  举报