uVa1587 长方体判断

前几天在uVa上,给女朋友挑了一道题,觉得简单,想让她自己解决掉这个问题,打破独自AC为 0 的记录,结果,这几天本身比较忙加上各种事情,这个她也没有时间去做,所以,今天我看看题,对一个人而言,这是一个非常简单的问题,6块板能不能拼成正方体,一个小学生都知道如何完成,但是,仔细想程序,如何利用最简单的思维去判断六个面能否拼接成完整的长方体,还是比较困难的一件事,当然,通过分情况讨论的方式去解决未尝不是一件好的方式,但对于懒熊一样的我而言,肯定是不愿意用无数多个if和else让自己的程序看上去无底线的low,所以,通过分析,发现了一个重要的规律。

长方体是由六个面组成,而实际上,对面一定是相同的,所以,第一点我们需要明白的是,六个面中两两一定是一样的,通过了这个条件之后,我们实际只需要在判断三个面的边是否满足条件,我们首先要通过各个平面的长和宽对各个面进行排序,例如,当长方体的长、宽、高分别是3,2,1,对应的三个面的长宽分别是(3,2)(3,1)(2,1)  通过程序,将三个面排序成这样顺序,这样,只要满足第一个面的第一个边和第二个面的第一个边相等,且当第一个面的第二条边和第三个面的第一条边相等,且当第二个面的第二条边和第三个面的第二条边相等,这三个条件同时成立的时候,一定能构成长方体,所以实际上我们的程序要进行两次排序,首先对每个面的两个边进行排序,然后根据两个边的大小,对三个面进行排序即可完成。

我的程序思路基本上也是按照这个方式来的,1、对每个面的两个边排序,从大到小,实际上交换一个下值就好。  2、通过两个边的大小,对面进行排序,具体的操作时,先比较第一个边,第一个边大的排在前,否则排在后,第一个

#include 
#include 
#include 

typedef struct RECTANGLE
{
    int m_length;
    int m_width;
}RECTANGLE;

void m_swap(int *p_length, int *p_width)
{
    int p;
    p = *p_length;
    *p_length = *p_width;
    *p_width = p;
}

int m_cmp(const void *a, const void *b)
{
    return((*(RECTANGLE *)a).m_length != (*(RECTANGLE *)b).m_length ? ((*(RECTANGLE *)b).m_length - (*(RECTANGLE *)a).m_length) : ((*(RECTANGLE *)b).m_width - (*(RECTANGLE *)a).m_width));
}

int main()
{
    int i=0,j=0;
    int temp=0;
    char str[20]="POSSIBLE";
    RECTANGLE rectangle[6];
    while(scanf("%d %d %d %d %d %d %d %d %d %d %d %d",&rectangle[0].m_length, &rectangle[0].m_width, &rectangle[1].m_length, &rectangle[1].m_width,
                &rectangle[2].m_length, &rectangle[2].m_width, &rectangle[3].m_length, &rectangle[3].m_width,
                &rectangle[4].m_length, &rectangle[4].m_width, &rectangle[5].m_length, &rectangle[5].m_width)!=EOF)
    {
        for(i=0;i<6;i++){
            if(rectangle[i].m_length < rectangle[i].m_width){
                m_swap(&rectangle[i].m_length,&rectangle[i].m_width);
            }
        }
        qsort(rectangle, 6, sizeof(rectangle[0]), m_cmp);
        strcpy(str,"IMPOSSIBLE");
        if(((rectangle[0].m_length == rectangle[1].m_length)&&(rectangle[0].m_width == rectangle[1].m_width))&&
           ((rectangle[2].m_length == rectangle[3].m_length)&&(rectangle[2].m_width == rectangle[3].m_width))&&
           ((rectangle[4].m_length == rectangle[5].m_length)&&(rectangle[4].m_width == rectangle[5].m_width)))
        {
            if((rectangle[0].m_length == rectangle[2].m_length)&&(rectangle[0].m_width == rectangle[4].m_length)&&(rectangle[2].m_width == rectangle[4].m_width))
            {
                strcpy(str,"POSSIBLE");
            }
        }
        printf("%s\n",str);
    }
    return 0;
}

边相等的,通过比较第二个边的大小,对面进行排序。

排序结束后就开始判断,首先判断6个面两两相等,在这个条件的基础上,对第1个面,第3个面,第5个面的边进行判断,保证第一个面的第1个边和第3个面的第一个边相等,且当第1个面的第二条边和第5个面的第一条边相等,且当第3个面的第二条边和第5个面的第二条边相等,条件均成立的情况认为可以构成长方体,否则无法构成。

你可能感兴趣的:(uVa1587 长方体判断)