习题3-10 盒子 UVa1587
感悟。
1、上网站下载英文原题,仔细阅读。
2、思路清晰流畅,设置结构体,第一个数据是较小的边,第二个数据是较大的边。
3、根据结构体中对应两条边相等,找出3个不同的面。
4、将3个面里的边由小到大排序。
5、每个面对应边的关系et[0].a==et[1].a&&et[0].b==et[2].a&&et[1].b==et[2].b。
6、提交AC,好长时间没有提交一次就AC了。
7、思路虽然清晰,但编码过程中,还是存在笔误,所以写好一段代码,就跟踪一段,是十分有必要的。
附上代码
环境Dev-cpp4.9.9.2
#include <stdio.h>
#include <string.h>
struct edge{
int a;
int b;
}e[6],et[3],ee;
int book[6];
int main(){
int i,j;
int a,b,t;
int eflag; //退出标识
int count;
while(1){
eflag=0;
memset(book,0,sizeof(book));
for(i=0;i<6;i++){
if(scanf("%d%d",&a,&b)==EOF){//解决了退出机制,开始还在考虑怎么退出,现今解决了
eflag=1;
break;
}
if(a>b){//自小到大储存边长
t=a;
a=b;
b=t;
}
e[i].a=a;
e[i].b=b;
}
if(eflag)//eflag=1退出
break;
count=0;
for(i=0;i<6;i++){
for(j=0;j<6;j++){
if(i!=j&&book[i]==0&&book[j]==0&&e[i].a==e[j].a&&e[i].b==e[j].b){//寻找相同的两个面,共有3对
book[i]=1;
book[j]=1;
et[count]=e[i];
count++;
}
}
}
if(count==3){
for(i=0;i<count;i++){
for(j=i+1;j<count;j++){
if(et[i].a>=et[j].a&&et[i].b>=et[j].b){
ee=et[i];
et[i]=et[j];
et[j]=ee;
}
}
}
if(et[0].a==et[1].a&&et[0].b==et[2].a&&et[1].b==et[2].b){//a,b,c三条边
printf("POSSIBLE\n");
}else
printf("IMPOSSIBLE\n");
}else
printf("IMPOSSIBLE\n");
}
return 0;
}