原博客地址:http://blog.csdn.net/tigerisland45/article/details/52088984
Regionals 2004 >> Europe - Northeastern
问题链接:UVA1587 UVALive3214 POJ2160 Box。
问题简述:给出六组整数,问能否构成六面体。
这个题用C语言做的毫无技术含量,也许用C++来写会好一些。
/* UVA1587 UVALive3214 POJ2160 Box */
#include <stdio.h>
#define MAXN 6
struct {
int w, h;
int count;
} a[MAXN];
int acount;
void swap(int n) //保证第n个板子的w<=h
{
if(a[n].w > a[n].h) {
int temp = a[n].w;
a[n].w = a[n].h;
a[n].h = temp;
}
}
int checkok() //判断三块不同的板子是否任意两个之间存在两个边相等
{
if(a[0].w == a[1].w && a[0].h == a[2].w && a[1].h == a[2].h)
return 1;
else if(a[0].w == a[1].w && a[0].h == a[2].h && a[1].h == a[2].w)
return 1;
else if(a[0].w == a[1].h && a[0].h == a[2].w && a[1].w == a[2].h)
return 1;
else if(a[0].w == a[1].h && a[0].h == a[2].h && a[1].w == a[2].w)
return 1;
else if(a[0].h == a[1].w && a[0].w == a[2].w && a[1].h == a[2].h)
return 1;
else if(a[0].h == a[1].w && a[0].w == a[2].h && a[1].h == a[2].w)
return 1;
else if(a[0].h == a[1].h && a[0].w == a[2].w && a[1].w == a[2].h)
return 1;
else if(a[0].h == a[1].h && a[0].w == a[2].h && a[1].w == a[2].w)
return 1;
else
return 0;
}
int main(void)
{
int i, j;
while(scanf("%d%d", &a[0].w, &a[0].h) != EOF) {
a[0].count = 1; //先输入第一块板子
swap(0);
acount = 1; //标记不同的板子个数
//输入后MAXN-1块板子,若有重复的则只将计数器加1,不再增加存储的结构体。
for(i=1; i<MAXN; i++) {
scanf("%d%d", &a[acount].w, &a[acount].h);
a[acount].count = 1;
swap(acount);
/* 去重复 */
for(j=0; j<acount; j++) //对acount之前的板子进行遍历,若有和第acount块板子大小相同的
if(a[j].w == a[acount].w && a[j].h == a[acount].h && a[j].count != 2) {
a[j].count++;
acount--;
break;
}
acount++;
}
if(acount != 3) //不存在三块不同大小的板子,无法构成题中要求的不同大小的盒子
printf("IMPOSSIBLE\n");
else if(checkok())
printf("POSSIBLE\n");
else
printf("IMPOSSIBLE\n");
}
return 0;
}
题目分析:
由题意知道盒子是由不全相同的方板组成的,又相对的板子一定相同,所以盒子的方板一定有三个不同的,若不够三个,则一定不能构成这里的盒子。
当存在三个不同的盒子的时候,要想构成这个长方体的盒子,又必须满足三个板子中任意两个板子一定有一对边相等。
代码分析:
代码逻辑处理过程:
①输入6组数据。
输入时保持h
#include <iostream>
#include<stdio.h>
#define MAX 6
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
/*
http://poj.org/problem?id=2160
*/
using namespace std;
//方块结构体
struct pallet{
int h;
int w;
int count;
}a[6];
void swap(int p){
//保证p组数据的h<=w
if(a[p].h>a[p].w){
int tmp=a[p].w;
a[p].w=a[p].h;
a[p].h=tmp;
}
}
bool check(){
//判断三个不同大小的方块是否任意两个都有相同的边
bool ans=false;
if(a[0].h == a[1].h && a[0].w == a[2].h && a[1].w == a[2].w){
ans=true;
}else
if(a[0].h == a[1].h && a[0].w == a[2].w && a[1].w == a[2].h){
ans=true;
}else
if(a[0].h == a[1].w && a[0].w == a[2].h && a[1].h == a[2].w){
ans=true;
}else
if(a[0].h == a[1].w && a[0].w == a[2].w && a[1].h == a[2].h){
ans=true;
}else
if(a[0].w == a[1].h && a[0].h == a[2].h && a[1].w == a[2].w){
ans=true;
}else
if(a[0].w == a[1].h && a[0].h == a[2].w && a[1].w == a[2].h){
ans=true;
}else
if(a[0].w == a[1].w && a[0].h == a[2].h && a[1].h == a[2].w){
ans=true;
}else
if(a[0].w == a[1].w && a[0].h == a[2].w && a[1].h == a[2].h){
ans=true;
}
return ans;
}
int main(int argc, char *argv[]) {
//1.输入数据
int size=0; //标记输入的不同的方块的个数
int length=0;
while(length<MAX){
length++;
scanf("%d %d",&a[size].h,&a[size].w);
a[size].count=1;
swap(size); //保证输入的第size个数据的h<=w
//判断这组数据是否和之前的数据重复
for(int i=0;i<size;i++){
if(a[size].h== a[i].h && a[size].w == a[i].w && a[i].count != 2){
size--; //不同的方块的个数减1
a[i].count++;
break;
}
}
size++;
}
// cout<<size<<endl;
//for(int i=0;i<3;i++){
// cout<<a[i].h<<" "<<a[i].w<<endl;
// }
//2.判断是否具有三个不同大小的方块,若无,则输出不能构成;若有,则进一步判断
if(size != 3){
cout<<"IMPOSSIBLE";
} else if(check() == true){
cout<<"POSSIBLE";
}else {
cout<<"IMPOSSIBLE";
}
return 0;
}
注意点:if(a[size].h== a[i].h && a[size].w == a[i].w && a[i].count != 2)中a[i].count != 2没有加,结果WA了。
分析原因:
a[i].count == 2的情况是这个相等的边已经有2个了,再有相等的就会超过2。此时应该在算一组边,此种情况的发生是当盒子为立方体的情况。
he knocks up wooden boxes of different sizes to pack machinery for delivery to the customers. Each box is a rectangular parallelepiped看来这句话理解有误,板子可以全部相同。