博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva1587 判断所给的六个面能否构成长方体
阅读量:4114 次
发布时间:2019-05-25

本文共 3328 字,大约阅读时间需要 11 分钟。

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

代码如下:

#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 (第三个面)

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

转载地址:http://sugsi.baihongyu.com/

你可能感兴趣的文章
Gas Station
查看>>
Palindrome Partitioning --回文切割 深搜(重重)
查看>>
Valid Palindrome 简单的回文判断
查看>>
Pascal's Triangle -- 生成杨辉三角
查看>>
Pascal's Triangle II 生成杨辉三角中的某行
查看>>
Minimum Depth of Binary Tree -- 二叉树的最小深度 DFS 加剪枝
查看>>
Climbing Stairs 爬楼梯方法 动态规划
查看>>
Merge Two Sorted Lists 合并两个有序链表
查看>>
pow(x,n) 为什么错这么多次
查看>>
Jump Game 动态规划
查看>>
Binary Tree Maximum Path Sum 自底向上求解(重重重重)
查看>>
Subsets 深搜
查看>>
Subsets II
查看>>
Edit Distance 字符串距离(重重)
查看>>
Gray Code 格雷码
查看>>
对话周鸿袆:从程序员创业谈起
查看>>
web.py 0.3 新手指南 - 如何用Gmail发送邮件
查看>>
web.py 0.3 新手指南 - RESTful doctesting using app.request
查看>>
web.py 0.3 新手指南 - 使用db.query进行高级数据库查询
查看>>
web.py 0.3 新手指南 - 多数据库使用
查看>>