zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    早该知道的7个JavaScript技巧
    ASP.NET 实现伪静态网页方法
    Nginx http大文件断点续传分块上传
    java http大文件断点续传分块上传
    B/S http大文件断点续传上传
    前端 http大文件断点续传上传
    百度WebUploader http大文件断点续传上传
    webuploader http大文件断点续传上传
    ceph 之recovery machhine
    docker private registry使用
  • 原文地址:https://www.cnblogs.com/yifeiWa/p/10121736.html
Copyright © 2011-2022 走看看