读程序 UVA1587 UVALive3214 POJ2160 Box

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值