uva 1587(Box UVA - 1587)
Posted baccano-acmer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva 1587(Box UVA - 1587)相关的知识,希望对你有一定的参考价值。
题目大意是给定6个数对,每个数对代表一个面的长和宽,判断这6个面是否能构成一个长方体。
这种题一看很复杂,但是只要不想多了实际上这就是一个水题。。。
首先说明一下判断的思路:
1.长方体是有三个对面的,所以先把这三个对面找出来(因为输入的长和宽是不确定的,所以先把每一组输入的两个数按照从大到小进行调整(这里建议开一个结构体数组))。调整完之后,自己写一个cmp的函数用来sort,cmp是先比较长(按照升序或者降序是无所谓的,随你)然后如果长相等那么就比较宽(按照和长一样的顺序比较)。
2.你以为这样就完了,那么你就错了,不信你试试马上一个WA,我就是这样,其实还漏了一个条件。比如这组测试数据:
3 3
3 3
3 2
3 2
2 2
2 2
按照第一个条件进行输出会输出POSSIBLE实际上它是IMPOSSIBLE.为什么?因为长方体的不一样长的边数一定是4的倍数,不是的话一定不行,像这一组数据,6个3 6个2一看就不对,所以我们要加上第二个条件,对每一组的输入的长和宽进行计数(这里我是开了一个bk数组,因为是1e4的数据大小所以完全可以开的出来,然后开一个计数数组记录不同的长和宽,然后直接从计数的数组进行循环比较每一个bk[jishu[i]]%4就行了)
我的代码:
#include <bits/stdc++.h> //#include "fp.h" using namespace std; int bk[10010]; int c[20]; struct node { int x,y; }a[10]; bool cmp(node aa,node b) { return aa.x==b.x?aa.y>b.y:aa.x>b.x; } bool check(int aa) { if(a[aa].x==a[aa+1].x&&a[aa].y==a[aa+1].y) return true; else return false; } main() { //fop(); while(cin>>a[0].x>>a[0].y>>a[1].x>>a[1].y>>a[2].x>>a[2].y>>a[3].x>>a[3].y>>a[4].x>>a[4].y>>a[5].x>>a[5].y) { memset(bk,0,sizeof(bk)); int k=0; for(int i=0;i<6;i++) { bk[a[i].x]++; bk[a[i].y]++; if(bk[a[i].x]==1) c[k++]=a[i].x; if(bk[a[i].y]==1) c[k++]=a[i].y; } int ff=1; for(int i=0;i<k;i++) if(bk[c[i]]%4!=0) { ff=0;break; } for(int i=0;i<6;i++) if(a[i].x<a[i].y) { int t; t=a[i].x; a[i].x=a[i].y; a[i].y=t; } sort(a,a+6,cmp); int f=1; for(int i=0;i<5;i+=2) if(!check(i)) { f=0; break; } printf("%s ",(f&&ff)?"POSSIBLE":"IMPOSSIBLE"); } }
以上是关于uva 1587(Box UVA - 1587)的主要内容,如果未能解决你的问题,请参考以下文章