1587:Box
Box
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 4196 | Accepted: 1518 |
Description
Ivan works at a factory that produces heavy machinery. He has a simple job -- he knocks up wooden boxes of different sizes to pack machinery for delivery to the customers. Each box is a rectangular parallelepiped. Ivan uses six rectangular wooden pallets to make a box. Each pallet is used for one side of the box.
Joe delivers pallets for Ivan. Joe is not very smart and often makes mistakes -- he brings Ivan pallets that do not fit together to make a box. But Joe does not trust Ivan. It always takes a lot of time to explain Joe that he has made a mistake.
Fortunately, Joe adores everything related to computers and sincerely believes that computers never make mistakes. Ivan has decided to use this for his own advantage. Ivan asks you to write a program that given sizes of six rectangular pallets tells whether it is possible to make a box out of them.
Joe delivers pallets for Ivan. Joe is not very smart and often makes mistakes -- he brings Ivan pallets that do not fit together to make a box. But Joe does not trust Ivan. It always takes a lot of time to explain Joe that he has made a mistake.
Fortunately, Joe adores everything related to computers and sincerely believes that computers never make mistakes. Ivan has decided to use this for his own advantage. Ivan asks you to write a program that given sizes of six rectangular pallets tells whether it is possible to make a box out of them.
Input
Input consists of six lines. Each line describes one pallet and contains two integer numbers w and h (1 <= w, h <= 10 000) -- width and height of the pallet in millimeters respectively.
Output
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
Sample Output
POSSIBLE
Source
我的思路,将第一个面当做顶面,然后对于剩下五个面,确定是否有和顶面长宽均一样的面,即其对面;剩下四个面,找出他们的那条和顶面长宽均不相等的边,看看这四条边是否全部相等。两个条件都满足的话才是可以的。
代码
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 10000 + 5;
int main(){
int l,w;
while(scanf("%d %d",&l,&w) == 2){
int ls[5],ws[5],tmp[5];
int mark = 1,op = 0,first = 1,p,t;
for(int i = 0;i < 5;i++){
scanf("%d %d",&ls[i],&ws[i]);
if(first && ((ls[i] == l && ws[i] == w) || (ls[i] == w && ws[i] == l))){
p = i;
op = 1;
first = 0;
}
else if(ls[i] == l || ls[i] == w) tmp[i] = ws[i];
else if(ws[i] == l || ws[i] == w) tmp[i] = ls[i];
else mark = 0;
}
if(!op) mark = 0;
first = 1;
if(mark){
for(int i = 0;i < 5;i++){
if(i == p) continue;
if(first > 0){
t = tmp[i];
first = 0;
}
if(tmp[i] != t){
mark = 0;
break;
}
}
}
if(mark) printf("POSSIBLE\n");
else printf("IMPOSSIBLE\n");
}
return 0;
}
version 2:
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 10000 + 5;
int main(){
int l,w;
while(scanf("%d %d",&l,&w) == 2){
int ls[5],ws[5],tmp[5];
int mark = 1,op = 0,cnt = 0,first = 1;
for(int i = 0;i < 5;i++){
scanf("%d %d",&ls[i],&ws[i]);
if(first && ((ls[i] == l && ws[i] == w) || (ls[i] == w && ws[i] == l))){
op = 1;
first = 0;
}
else if(ls[i] == l || ls[i] == w) tmp[cnt++] = ws[i];
else if(ws[i] == l || ws[i] == w) tmp[cnt++] = ls[i];
else mark = 0;
if(cnt && tmp[cnt-1] != tmp[0]) mark = 0;
}
if(op && mark) printf("POSSIBLE\n");
else printf("IMPOSSIBLE\n");
}
return 0;
}
version 3:
#include<cstdio>
using namespace std;
int main(){
int l,w;
while(scanf("%d %d",&l,&w) == 2){
int tmp[4],mark = 1,op = 0,cnt = 0,a,b;
for(int i = 0;i < 5;i++){
scanf("%d %d",&a,&b);
if(!op && ((a == l && b == w) || (a == w && b == l))) op = 1;
else if(a == l || a == w) tmp[cnt++] = b;
else if(b == l || b == w) tmp[cnt++] = a;
else mark = 0;
if(cnt && tmp[cnt-1] != tmp[0]) mark = 0;
}
if(op && mark) printf("POSSIBLE\n");
else printf("IMPOSSIBLE\n");
}
return 0;
}
Email:JingwangLi@outlook.com