uva1587 判断所给的六个面能否构成长方体

第一次看到这个题时,我自己也没想出什么好的办法,当时在网上看了答案,太菜了也没看懂答案什么意思,过了好久现在又看这个题,想出了自己的办法。
代码如下:

#include 
#include 
typedef struct BOX
{
    int w;
    int h;
    int wn;
    int hn;
}BOX;

int main()
{
     BOX box[6];
    int i,j;
    while(scanf("%d%d%",&box[0].w,&box[0].h)!=EOF)
    {
        int sw=0,sh=0,tw,th,sw1=0,sh1=0;
        for(i=1;i<6;i++)
            scanf("%d%d",&box[i].w,&box[i].h);
            for(i=0;i<6;i++)
            {
                box[i].wn=0;
                box[i].hn=0;
            }
            for(i=0;i<5;i++)
                for(j=i+1;j<6;j++)
            {
                if(box[i].h==box[j].w)
                {
                     box[i].hn++;
                     box[j].wn++;
                }
                if(box[i].h==box[j].h)
                {
                    box[i].hn++;
                    box[j].hn++;
                }
                if(box[i].w==box[j].h)
                {
                    box[i].wn++;
                    box[j].hn++;
                }
                if(box[i].w==box[j].w)
                {
                    box[i].wn++;
                    box[j].wn++;
                }
            }
            int flag=0;
                for(i=0;i<6;i++)
            {
                if(!(box[i].wn%3==0||box[i].wn==7||box[i].wn==10))
                {
                    flag=1;
                    break;
                }
                if(!(box[i].hn%3==0||box[i].hn==7||box[i].hn==10))
                {
                    flag=1;
                   break;
                }
                if(box[i].hn==0)
                {
                    flag=1;
                    break;
                }
                if(box[i].wn==0)
                {
                    flag=1;
                    break;
                }

            }
            if(flag==0)
                printf("POSSIBLE\n");
            else
                printf("IMPOSSIBLE\n");
    }

    return 0;
}

其实很好理解,判断能否构成正方体,无非就是以下几种情况:
1、边长的情况有三种,是一个标准的长方体,那么六条边都有另外三条边与之相等;

2、边长的情况有两种,那么每条边对应的相等的情况就有两种情况,分别是有三个或者是七个变与之相等;

3、边长的情况只有一种,那么此时每条边都是有十条边与之相等。

注意:此时我说的相等等情况都是除去与他成对出现的那条边,
其实如果不好理解的话,可以把这几种情况都列举出来,在逐一排除其他特殊情况,还是都写出来比较好理解。
下面我们看一下其他人的做法
法一:

#include  
#include  
using namespace std;  

struct mian{  
    int c;  
    int k;  
}p[10];  

bool so(mian a,mian b){  
    if(a.c!=b.c)  
        return a.c>b.c;  
    return a.k>b.k;  
}  

bool operator ==(mian a,mian b){  
    if(a.c==b.c && a.k==b.k)  
        return true;  
    return false;  
}  

int main(){  
    int a,b;  
    while(~scanf("%d %d",&a,&b)){  
        int x=max(a,b);  
        int y=min(a,b);  
        p[0].c=x;  
        p[0].k=y;  
        for(int i=1;i<6;i++){  
            scanf("%d %d",&a,&b);  
            x=max(a,b);  
            y=min(a,b);  
            p[i].c=x,p[i].k=y;  
        }  
        sort(p,p+6,so);  
        if(p[0]==p[1] && p[3]==p[2] && p[4]==p[5] && p[0].c==p[3].c  
           && ((p[5].c==p[0].k && p[2].k==p[4].k)|| (p[5].c==p[3].k && p[0].k==p[5].k)))  
            printf("POSSIBLE\n");  
        else  
            printf("IMPOSSIBLE\n");  
    }  
    return 0;  
}

分析:
定义一个mian的结构体{
int 长;
int 宽;
};
输入的时候严格按照长大于宽输入
然后sort
长相等的时候按宽排序
这样三对面就排在一起了
然后判断
即:
如果要构成一个长方体的话,有3对面是一样的 先判断这个成立了,再判断能否构成长方体 假设现在剩下的面就为

2 3 (第一个面)

3 4 (第二个面)

4 2 (第三个面)

发现是首尾相接的,即为只需要判断三次,第一个面的长或者宽或者两者都在第二个面出现,第一个面的长或者宽或者两者都在第三个面出现,第二个面的长或者宽或者两者都在第三个面出现,如果三个条件都满足的话,就构成了

你可能感兴趣的:(C语言)