原博客地址: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--; //不同的方块的个数减1a[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看来这句话理解有误,板子可以全部相同。