习题3-10 盒子(Box, UVa1587)题解——30行代码

欢迎访问我的Uva题解目录https://blog.csdn.net/richenyunqi/article/details/81149109

题目描述

习题3-10 盒子(Box, UVa1587)题解——30行代码_第1张图片

题意解析

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

算法设计

定6个矩形能构成长方体要满足两个条件:

  1. 6个矩形需要构成3对完全相同的矩形。
  2. 6个矩形的12条边应该构成3组(每组4条)完全相同的边,作为长方体的长宽高
  • 第1点可以通过定义一个map,int>类型的变量mp来实现**(注意不能用unordered_map类型,因为pair类型没有定义hash函数,不能作为unordered_map的键)**。mp的键表示矩形的长宽,值表示与键表示的矩形长宽相等的矩形的个数,统计完成之后,遍历mp,判断mp中元素的值能否整除2即可。
  • 同理,第2点可以通过定义一个unordered_map类型的变量m来实现。m的键表示边长,值表示与键表示的边长相等的边的个数,统计完成之后,遍历m,判断m中元素的值能否整除4即可。

C++代码

#include
using namespace std;
int main(){
    while(true){
        unordered_map<int,int>m;
        map<pair<int,int>,int>mp;
        for(int i=0;i<6;++i){
            int k1,k2;
            if(scanf("%d%d",&k1,&k2)==EOF)
                goto loop;
            ++m[k1];
            ++m[k2];
            ++mp[make_pair(max(k1,k2),min(k1,k2))];
        }
        for(auto&i:m)
            if(i.second%4!=0){
                puts("IMPOSSIBLE");
                goto loop2;
            }
        for(auto&i:mp)
            if(i.second%2!=0){
                puts("IMPOSSIBLE");
                goto loop2;
            }
        puts("POSSIBLE");
loop2:;
    }
loop:
    return 0;
}

你可能感兴趣的:(算法竞赛入门经典,-,Uva)