(UVa 1587)6矩形能否构成长方体

Problem Description

给定6个矩形的长和宽wi和hi(1<=w, hi <= 1000),判断它们能否构成长方体的六个面。

Sample Input

1345 2584
2584 683
2584 1345
683 1345
683 1345
2584 683
1234 4567
1234 4567
4567 4321
4322 4567
4321 1234
4321 1234

Sample Output

POSSIBLE
IMPOSSIBLE

自身写的思路过于复杂,而且编写的过程踩了很多坑。
思路:
①将相等的矩形归到一处,即length[num],length[num+6];
②计算矩形的种类num及各个种类的个数kinds[num]
③判断kinds[num]中是否都为偶数,否则不可能
④判断num的值,分为3<,3,2,1,共4种情况判断,其中3的判断又复杂起来,3种矩形的6条边的值是否能化成k=3的ken[k=0 1 2]=2的情况,能则为可能。

写完自己的思路感觉自己宛如智障!!!

代码:

#include<cstdio>
#include<cstring>
using namespace std;
int main(){
	int rectange[7][2];		//存放矩形 
	int hash[7];			 
	bool isequal(int a,int b,int c,int d); //判断2个矩形是否相等 
	while(scanf("%d %d",&rectange[0][0],&rectange[0][1])!=EOF){
		memset(hash,0,sizeof(hash));
		for(int i=1; i != 6; i++)scanf("%d %d",&rectange[i][0],&rectange[i][1]);
		bool flag;
		int kinds[6]={0},num=0;
		int length[13];
		memset(length,0,sizeof(length));
		for(int i=0; i<6; i++)
		{
			if(hash[i]==0){
				kinds[num]=1;//计算不同种矩形的个数 
				hash[i]=1;
				
				//矩形归类,同一种矩形放在一起 
				length[num]=rectange[i][0];
				length[num+6]=rectange[i][1];
				
				for(int j = i+1; j<6;j++)
				{
					if(hash[j]==0){
						flag=isequal(rectange[i][0],rectange[i][1],rectange[j][0],rectange[j][1]);
						if(flag){hash[j]=1;kinds[num]++;}
					}
					
				}
				num++;//计算矩形种类的个数 
				
			}
		}
		
		//同种矩形不为奇数个则不可能 
		if(kinds[0]%2!=0||kinds[1]%2!=0||kinds[2]%2!=0){printf("IMPOSSIBLE\n");continue;}
			
		//矩形种类超3种不可能 
		if(num>3){
			printf("IMPOSSINLE\n");continue; 
		}
		else if(num==3){
			int len[3]={0},k=0;//len计算同种长度的个数,k计算长度的种数 
			for(int i=0;i<=12;i++)
			{
				if(length[i]!=0){
					len[k]++;
					for(int j=i+1;j<=12;j++)
					{
						if(length[i]==length[j]){len[k]++;length[j]=0;}
					}
					k++;
				}
			}
			//只有3种矩形,且只有3种长度各2个为可能 
			if(k==3&&len[0]==len[1]&&len[1]==len[2]&&len[0]==2)printf("POSSIBLE\n");
			else printf("IMPOSSIBLE\n");
			continue;
		}
		// 2种矩形,只要其中有长度相等就为可能 
		else if(num==2){
			if(length[0]==length[6]||length[1]==length[7])printf("POSSIBLE\n");
			else printf("IMPOSSIBLE\n");
			continue;
		}
		//1种矩形为正方体,可能 
		else if(num==1){
			printf("POSSIBLE\n");continue;
		} 
		else printf("IMPOSSIBLE\n"); 
	}
	
}

bool isequal(int a , int b, int c, int d ){
	if((a==c&&b==d)||(a==d&&c==b))return true;
	else return false;
}

这个链接的博主思路清晰很多,代码复制如下:
大佬的思路:
①矩形存储,左小右大
②矩形按边排序,左边相等则按右边,使用sort()函数
③两两比较,如果不对应相等则不满足
④如果相等则判断小中2个小矩形的两小边是否相等,不相等则不满足
⑤相等,则判断小中跟大矩形间是否各自有一边相等,分2种情况:
Ⅰ小矩形的大边等于大矩形的小边,中矩形的大边等于大矩形的大边
Ⅱ小矩形的大边等于大矩形的大边,中矩形的大边等于大矩形的小边
⑥相等则满足
简洁明了,哭了!

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int w, h;
};
bool cmp(node a, node b)
{
    if(a.w == b.w) return a.h < b.h;
    else return a.w < b.w;
}
int main()
{
    node a[6];
    int i;
    while(~scanf("%d %d", &a[0].w, &a[0].h))
    {
        if(a[0].w > a[0].h) swap(a[0].w, a[0].h);//左小右边大
        for(i = 1; i < 6; i++)
        {
            scanf("%d %d", &a[i].w, &a[i].h);
            if(a[i].w > a[i].h) swap(a[i].w, a[i].h);
        }
        sort(a, a + 6, cmp);//从小到大排序,左边一样大的话,右边从小到大排序
        int flag = 0;
        for(i = 0; i < 6; i += 2)
        {
            //如果不满足两个矩形 对应相等 break;
            if(a[i].w != a[i + 1].w || a[i].h != a[i+1].h)
            {
                flag = 1;
                break;
            }
        }
        if(!flag)//满足
        {
            if(a[0].w == a[2].w)//两个矩阵最小的两个边相等
            {
                if((a[0].h == a[4].w && a[2].h == a[4].h) || (a[0].h == a[4].h && a[2].h == a[4].w))//两种情况
                {
                    printf("POSSIBLE\n");
                }
                else printf("IMPOSSIBLE\n");
            }
            else printf("IMPOSSIBLE\n");//非则构不成
        }
        else printf("IMPOSSIBLE\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值