您的位置:首页 > 其它

习题3-10 盒子 UVa1587

2016-07-31 13:32 381 查看
算法竞赛入门经典(第2版)第3章 数组和字符串

习题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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: