第一次看到这个题时,我自己也没想出什么好的办法,当时在网上看了答案,太菜了也没看懂答案什么意思,过了好久现在又看这个题,想出了自己的办法。
代码如下:
#include <stdio.h>
#include <stdlib.h>
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<stdio.h>
#include<algorithm>
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 (第三个面)
发现是首尾相接的,即为只需要判断三次,第一个面的长或者宽或者两者都在第二个面出现,第一个面的长或者宽或者两者都在第三个面出现,第二个面的长或者宽或者两者都在第三个面出现,如果三个条件都满足的话,就构成了