UVa 1587 Box

题目:https://vjudge.net/problem/UVA-1587

题意:给出6个矩形的长和宽,均小于10000,判断是否可组成一个长方体,可以的话,”输出 POSSIBLE“。否则输出“IMPOSSIBLE”

解法:把6个面排序,先按宽度从小到大排,再把宽度相等的面按长度从小到大排。经上述方式排序后,要构成长方体,首先保证第1、2面,第3 、4面,第5、6面分别相同,而且,第2、 3面的宽必须相等(上面已保证1和2,3和4面分别相同),第2面的长等于第5面的宽,第四、五面的长必须相等。

要保证每个面的长大于宽,否则上述排序没用,也就得不到正解。

#include <stdio.h>
#include <string.h>
#include<algorithm>
using namespace std;
struct uct
{
    int w,h;//w 表示宽,h表示长
};
uct a[6];

int w;
int cmp(uct n1,uct n2)
{
    if(n1.w==n2.w)
        return n1.h<n2.h;
    return n1.w<n2.w;
}
int pd()
{
    if(a[0].h != a[1].h || a[0].w != a[1].w) return 0;
    if(a[2].h != a[3].h || a[2].w != a[3].w) return 0;
    if(a[4].h != a[5].h || a[4].w != a[5].w) return 0;
    if(a[1].w != a[2].w) return 0;
    if(a[1].h != a[4].w) return 0;
    if(a[3].h != a[4].h) return 0;

    return 1;

}
int main()
{
    while(scanf("%d%d",&a[0].w,&a[0].h)!=EOF)
    {

        for(int i= 1 ; i<6; i++)
        {
            scanf("%d%d",&a[i].w,&a[i].h);
            if(a[i].w>a[i].h)
                swap(a[i].w,a[i].h);
        }
        int i=0 ;
        if(a[i].w>a[i].h)
                swap(a[i].w,a[i].h);
        sort(a,a+6,cmp);
       /* for(int i=0 ;i<6 ;i++)
        {
            printf("%d %d\n",a[i].w,a[i].h);
        }
*/
       if(!pd())
        printf("IM");
       puts("POSSIBLE");

    }
    return 0;
}

 

全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务