UVa 1587 Box 盒子

这道题的链接:https://vjudge.net/problem/UVALive-3214

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

Sample Input

1345 2584

2584 683

2584 1345

683 1345

683 1345

2584 683

1234 4567

1234 4567

4567 4321

4322 4567

4321 1234

4321 1234

Sample Output

POSSIBLE

IMPOSSIBLE

这道题是给6个面来判断能否构成长方体的6个面

那么我们不妨先思考一下长方体的6个面具有什么特征

比如一个长宽高分别为a, b, c的长方体,a, b, c之间的大小关系未知

那么6个面分别为ab, ab, ac, ac, bc, bc

对于普通(a, b, c之间的大小关系未知)的情况我们发现一定会有两个面是相同的,而且有三组这样的两个面(ab, ab为一组, bc, bc为一组,ac, ac为一组)

得到了这样的关系后我们就可以进行判断题目中所给的6个面是否能够构成长方体了

具体怎么实现的呢:

1.首先将6个面进行排序,根据6个面的长进行排序,如果长相等时,那么根据宽边的大小进行排序

2.得到了排好顺序后的6个面后,我们需要进行判断,怎么判断呢?如果6个面可以构成长方体的话

那么排列好的顺序为(a1, b1)(a1, b1), (a1, c1), (a1, c1), (c1, b1), (c1, b1)(a1 >= c1 >= b1) 

所以我们判断第一个面与第二个面是否相同, 第三个面与第四个面是否相同,第五个面与第六个面是否相同

然后再判断有几个不同的数,用count(计数器)计数,如果count <= 3就OK了(自己想一想为什么)

总结来看我们的代码包括以下几个模块:

1.排序

2.两个两个的比对

3.count <= 3

下面是代码:

//UVa 1587 Box
//yifei Wa 

#include <stdio.h> 
#include <string.h>
#define maxn 10

int a[maxn], b[maxn], count; //count计数器 

void swap(int& i, int& j) {
    int t = i; 
    i = j; 
    j = t;     
}

void sort() {
    for(int i = 0; i < 5; i++) 
        for(int j = i+1; j < 6; j++) 
            if(a[i] < a[j]) { swap(a[i], a[j]); swap(b[i], b[j]); }
            else if(a[i] == a[j] && b[i] < b[j]) { swap(a[i], a[j]); swap(b[i], b[j]); }
}

bool check_2() { //两个两个的比对 
    int flag = 0; 
    for(int i = 0; i <= 4; i+=2) 
        if(a[i] != a[i+1] || b[i] != b[i+1]) { flag = 1; break; } 
    if(flag) return 0; 
    int num[20];
    memset(num, 0, sizeof(num));
    num[++count] = a[0];  
    for(int i = 0; i < 6; i++) {
        flag = 0; 
        for(int j = 0; j <= count; j++) 
            if(num[j] == a[i]) { flag = 1; break; } 
        if(!flag) 
            num[++count] = a[i]; 
    }
    for(int i = 0; i < 6; i++) {
        flag = 0; 
        for(int j = 0; j <= count; j++)
            if(num[j] == b[i]) { flag = 1; break; }
        if(!flag) 
            num[++count] = b[i];     
    }
    return 1;
}

int main() 
{
    while(scanf("%d%d", &a[0], &b[0]) != EOF) {
        if(a[0] < b[0]) swap(a[0], b[0]); 
        count = 0;
        for(int i = 1; i < 6; i++) {
            scanf("%d%d", &a[i], &b[i]); 
            if(a[i] < b[i]) swap(a[i], b[i]);
        }
        sort(); //排序 
        if(check_2() && count <= 3) printf("POSSIBLE
"); 
        else printf("IMPOSSIBLE
");  
    }
    return 0;
}

相信大家一定能够明白这道题的,这道题不难,主要还是想清楚长方体的特征,看清事物的本质再来写代码。

如果有什么错误的可以评论告诉我,我会及时修正的。

转载请表明出处。

2018年12月14日

yifei Wa

语言c++计算机程序设计爱好者 不定期更新题目题解 望互相分享心得体会 有意留言加q
原文地址:https://www.cnblogs.com/yifeiWa/p/10121736.html