ZOJ 2659 Box

时间: 2024-11-10 admin IT培训

ZOJ 2659 Box

ZOJ 2659 Box

查看原题

题意

给出六块板的长宽,问是否能组成一个箱子

思路

箱子的话则必有三对相同的长宽,每对保留其中一个的长宽,然后比较三个长宽(6个数字)能否匹配。(A板1和B板1相同匹配,则B板0必和C板其中之一相同匹配,C板另一边和A板0相同匹配)

代码

#include <iostream>
using namespace std;
struct pallet{int width,height;
}pallets[6];
int isSame(pallet a,pallet b){//两板比较是否相同if(a.width==b.width){if(a.height==b.height){return 1;}else return 0;}else if(a.width==b.height){if(a.height==b.width){return 1;}else return 0;}else{return 0;}
}
int isBox(pallet a,pallet b,pallet c){//比较三个长宽是否匹配int flag=0;if(a.width==b.width){if(b.height==c.height){if(c.width==a.height){flag=1;}}else if(b.height==c.width){if(c.height==a.height){flag=1;}}}else if(a.width==c.width){if(c.height=b.height){if(b.width==a.height){flag=1;}}else if(c.height==b.width){if(b.height==a.height){flag=1;}}}return flag;
}
int main() {while(cin>>pallets[0].width>>pallets[0].height){int number=0;for(int i=1;i<6;i++){cin>>pallets[i].width>>pallets[i].height;}for(int i=0;i<6;i++){//把输入转化为小数为width,大数heightif(pallets[i].width>pallets[i].height){int n=pallets[i].width;pallets[i].width=pallets[i].height;pallets[i].height=n;}}for(int i=0;i<6;i++){//给每块板找另一半,找到就停,为下一块找int flag=0;for(int j=i;j<6;j++){if(i!=j&&isSame(pallets[i],pallets[j])&&pallets[j].width!=0&&flag==0){number++;flag=1;pallets[j].width=pallets[j].height=0;}continue;}}pallet temp[3];int step=0;for(int k=0;k<6;k++){//找出留下的三块板if(pallets[k].width!=0){temp[step]=pallets[k];step++;}}for(int i=0;i<3;i++){//按width从小到大冒泡排序,width相同则按height//给height也排是为了防止24 24 22 这样特殊情况for(int j=i;j<3;j++){if(temp[i].width>temp[j].width){pallet swap=temp[i];temp[i]=temp[j];temp[j]=swap;}if(temp[i].width==temp[j].width&&temp[i].height>temp[j].height){pallet swap=temp[i];temp[i]=temp[j];temp[j]=swap;}}}if(number==3&&isBox(temp[0],temp[1],temp[2])) cout<<"POSSIBLE"<<endl;else cout<<"IMPOSSIBLE"<<endl;}return 0;
}