当前位置: 代码迷 >> 综合 >> 盒子(Box,ACM/ICPC NEERC 2004,UVa1587)
  详细解决方案

盒子(Box,ACM/ICPC NEERC 2004,UVa1587)

热度:68   发布时间:2023-12-28 06:21:25.0

盒子(Box,ACM/ICPC NEERC 2004,UVa1587)

 

题目描述:

给出6个木条的长和宽,判断用这些木条能否组成长方体。能,输出POSSIBLE;否则输出IMPOSSIBLE

思路详解:

先是在输入数据的时候就先对其作出处理,保证x<y;
再是对存储在结构体中的数据排序。
如果x相同,则按照y的值从小到大排序;否则按照x的值从小到大排序。 

长方体有三个“对面”,排好序后,直接判断一下“对面”的长宽是否相等,用flag做列标记。

也就是 判断一对面中的长或宽等于另一对面中的长或宽 。box

以第一组数据为例:

1345  2584

2584  683

2584  1345

683    1345

683    1345

2584  683

排序之后:

0  683  1345

1  683  1345

2  683  2584

3  683  2584

4  1345 2584

5  1345 2584

 

代码:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std; struct mp{int x,y; 
} ; 
bool cmp(mp a,mp b) 
{if(a.x==b.x)return a.y<b.y;return a.x<b.x; 
} 
int main()
{int a,b;while(cin>>a>>b){if(a>b)swap(a,b);mp d[7];d[0].x=a;d[0].y=b;for(int i=1;i<6;i++){cin>>a>>b;if(a>b)swap(a,b);d[i].x=a;d[i].y=b; } //先是在输入数据的时候就先对其作出处理,保证x<y;//再是对存储在结构体中的数据排序。//如果x相同,则按照y的值从小到大排序;否则按照x的值从小到大排序。 sort(d,d+6,cmp);int flag=1; //长方体有三个“对面”,排好序后,直接判断一下“对面”的长宽是否相等,用flag做列标记 for(int i=0;i<6;i+=2){if(d[i].x!=d[i+1].x||d[i].y!=d[i+1].y) flag=0; } if(flag==1){//判断一对面中的长或宽等于另一对面中的长或宽 if(d[0].x!=d[2].x||d[0].y!=d[4].x||d[2].y!=d[4].y)flag=0; } if(flag==1)cout<<"POSSIBLE\n";else cout<<"IMPOSSIBLE\n"; } 
} 

 

  相关解决方案