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
  • 相关阅读:
    MLPclassifier,MLP 多层感知器的的缩写(Multi-layer Perceptron)
    linux 内存不足时候 应该及时回收page cache
    关闭swap的危害——一旦内存耗尽,由于没有SWAP的缓冲,系统会立即开始OOM
    使用Networkx进行图的相关计算——黑产集团挖掘,我靠,可以做dns ddos慢速攻击检测啊
    ARIMA模型实例讲解——网络流量预测可以使用啊
    http://www.secrepo.com 安全相关的数据获取源
    什么是HTTP Referer?
    列举某域名下所有二级域名的方法
    HMM(隐马尔科夫模型)——本质上就是要预测出股市的隐藏状态(牛市、熊市、震荡、反弹等)和他们之间的转移概率
    成都优步uber司机第五组奖励政策
  • 原文地址:https://www.cnblogs.com/yifeiWa/p/10121736.html
Copyright © 2011-2022 走看看