当前位置: 代码迷 >> 综合 >> 读程序 UVA1587 UVALive3214 POJ2160 Box
  详细解决方案

读程序 UVA1587 UVALive3214 POJ2160 Box

热度:67   发布时间:2023-09-22 23:36:05.0

原博客地址: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看来这句话理解有误,板子可以全部相同。