Input
Input file contains several test cases. Each of them consists of six lines. Each line describes one pallet and contains two integer numbers wand h ( 1w, h10 000) -- width and height of the pallet in millimeters respectively.Output
For each test case, print one output line. Write a single word ` POSSIBLE' to the output file if it is possible to make a box using six given pallets for its sides. Write a single word ` IMPOSSIBLE' if it is not possible to do so.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
解題思路: 把w和h作比較,然後w是小的,h是大的,排好一級排序後,按照6個面來排序,排好之後如果是possible,就會有0==1的面,2==3的面,4==5的面,取出不同的3個面,然後進行寬高是否相等。
#include <iostream>
#include <cstdio>
#include <algorithm>
#define MAXD 10
using namespace std;
struct M{
int w;
int h;
}rectangular[MAXD];
//比較交換
bool cmp(M m,M n){
if(m.w > n.w) return true;
if(m.w < n.w) return false;
if(m.h > n.h) return true;
else return false;
}
//判斷是否能構造長方體
bool solve(){
M ans[MAXD];
int m = 0;
for(int i = 0; i < 6 ; i+=2){
if(rectangular[i].w==rectangular[i+1].w && rectangular[i].h==rectangular[i+1].h)
ans[m] = rectangular[i],m++;
else return false;
}
if (rectangular[0].h==rectangular[2].h && rectangular[0].w==rectangular[4].h && rectangular[2].w==rectangular[4].w)
return true;
else return false;
}
void exchange(int i){ //寬高交換
int temp = rectangular[i].w;
rectangular[i].w = rectangular[i].h;
rectangular[i].h = temp;
}
int main(){ //一級排序是寬高排序
while(scanf("%d",&rectangular[0].w) != EOF){
scanf("%d",&rectangular[0].h);
if(rectangular[0].w > rectangular[0].h) exchange(0);
for(int i = 1; i < 6 ; i++){
scanf("%d%d",&rectangular[i].w,&rectangular[i].h);
if(rectangular[i].w > rectangular[i].h) exchange(i);
}
sort(rectangular,rectangular+6,cmp);//二級排序把面排序
bool ok = solve();
ok? printf("POSSIBLE\n"):printf("IMPOSSIBLE\n");
}
}