这道题的链接:https://vjudge.net/problem/UVALive-3214
给定6个矩形的长和宽wi与hi(1<=wi, hi<=1000), 判断它们能否构成长方体的6个面
Sample Input
1345 2584
2584 683
2584 1345
683 1345
683 1345
2584 683
1234 4567
1234 4567
4567 4321
4322 4567
4321 1234
4321 1234
Sample Output
POSSIBLE
IMPOSSIBLE
这道题是给6个面来判断能否构成长方体的6个面
那么我们不妨先思考一下长方体的6个面具有什么特征
比如一个长宽高分别为a, b, c的长方体,a, b, c之间的大小关系未知
那么6个面分别为ab, ab, ac, ac, bc, bc
对于普通(a, b, c之间的大小关系未知)的情况我们发现一定会有两个面是相同的,而且有三组这样的两个面(ab, ab为一组, bc, bc为一组,ac, ac为一组)
得到了这样的关系后我们就可以进行判断题目中所给的6个面是否能够构成长方体了
具体怎么实现的呢:
1.首先将6个面进行排序,根据6个面的长进行排序,如果长相等时,那么根据宽边的大小进行排序
2.得到了排好顺序后的6个面后,我们需要进行判断,怎么判断呢?如果6个面可以构成长方体的话
那么排列好的顺序为(a1, b1)(a1, b1), (a1, c1), (a1, c1), (c1, b1), (c1, b1)(a1 >= c1 >= b1)
所以我们判断第一个面与第二个面是否相同, 第三个面与第四个面是否相同,第五个面与第六个面是否相同
然后再判断有几个不同的数,用count(计数器)计数,如果count <= 3就OK了(自己想一想为什么)
总结来看我们的代码包括以下几个模块:
1.排序
2.两个两个的比对
3.count <= 3
下面是代码:
//UVa 1587 Box //yifei Wa #include <stdio.h> #include <string.h> #define maxn 10 int a[maxn], b[maxn], count; //count计数器 void swap(int& i, int& j) { int t = i; i = j; j = t; } void sort() { for(int i = 0; i < 5; i++) for(int j = i+1; j < 6; j++) if(a[i] < a[j]) { swap(a[i], a[j]); swap(b[i], b[j]); } else if(a[i] == a[j] && b[i] < b[j]) { swap(a[i], a[j]); swap(b[i], b[j]); } } bool check_2() { //两个两个的比对 int flag = 0; for(int i = 0; i <= 4; i+=2) if(a[i] != a[i+1] || b[i] != b[i+1]) { flag = 1; break; } if(flag) return 0; int num[20]; memset(num, 0, sizeof(num)); num[++count] = a[0]; for(int i = 0; i < 6; i++) { flag = 0; for(int j = 0; j <= count; j++) if(num[j] == a[i]) { flag = 1; break; } if(!flag) num[++count] = a[i]; } for(int i = 0; i < 6; i++) { flag = 0; for(int j = 0; j <= count; j++) if(num[j] == b[i]) { flag = 1; break; } if(!flag) num[++count] = b[i]; } return 1; } int main() { while(scanf("%d%d", &a[0], &b[0]) != EOF) { if(a[0] < b[0]) swap(a[0], b[0]); count = 0; for(int i = 1; i < 6; i++) { scanf("%d%d", &a[i], &b[i]); if(a[i] < b[i]) swap(a[i], b[i]); } sort(); //排序 if(check_2() && count <= 3) printf("POSSIBLE "); else printf("IMPOSSIBLE "); } return 0; }
相信大家一定能够明白这道题的,这道题不难,主要还是想清楚长方体的特征,看清事物的本质再来写代码。
如果有什么错误的可以评论告诉我,我会及时修正的。
转载请表明出处。
2018年12月14日
yifei Wa