uVa1587 长方体判断

来源:互联网 发布:怎样设置网站主域名 编辑:程序博客网 时间:2024/05/18 01:41

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

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

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

#include <stdio.h>#include <string.h>#include <stdlib.h>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个面的第二条边相等,条件均成立的情况认为可以构成长方体,否则无法构成。

原创粉丝点击