UVa1587--Box--盒子(自认为代码很好理解)

本文介绍了一种通过判断六个面是否能构成一个长方体的算法。通过统计不同类型的面并确保数量符合长方体特性,实现了对输入数据的有效验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意就是判断6个面能否组成一个长方体

做这道题的时候,想着,老子一定要用自己的方法,如果AC了,我一定要发题解!真的太不容易了。

一个晚上的时间终于把这道题给AC了。

思路:一个长方体有长宽高,有六个面,2长宽、2长高、2宽高,如果我能把输入的数值的种类提取出来并记录这些数值,种类数>3则不能围成长方体。
接着遍历输入的每一行数值,如果输入的一行数值不是长
宽、长高、宽高的一种,则说明不能围成长方体;建立cnt[3]数组,如果是长宽,cnt[0]++;长高,cnt[1]++;宽*高,cnt[2]++;

如果是三边都不相等的长方体,则:cnt[0]=cnt[1]=cnt[2]=2
如果长方体有两边相等,则说明有cnt[0]=4或cnt[1]=4或cnt[2]=4;
如果为正方体,则cnt[0]=6;

若满足以上三个条件的一个,说明可围成长方体。

蒻蒻的代码如下:(如有错误,望大神指出)

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a[15];
	while(cin>>a[0]){
		int num[15]={0},cnt[3]={0},count=1,i,j,flag=0;
		num[0]=a[0];
		for(i=1;i<12;i++)
		{
			flag=0;
			cin>>a[i];
			for(j=0;j<count;j++)
			{
				if(a[i]==num[j])
				{
					flag=1;
					break;
				}
			}
			if(flag==0)//没有在num出现过
			{
				num[count]=a[i]; 
				count++;
				}	
		}
		if(count>3)
		{
			printf("IMPOSSIBLE\n");
			continue;
		}
		if(count==1)
		{
			printf("POSSIBLE\n");
			continue;
		}
		for(i=0;i<12;i+=2){
			if((a[i]==num[0]&&a[i+1]==num[1])||(a[i]==num[1]&&a[i+1]==num[0]))
				cnt[0]++;//长宽
			else if((a[i]==num[0]&&a[i+1]==num[2])||(a[i]==num[2]&&a[i+1]==num[0]))
				cnt[1]++;//长高
			else if((a[i]==num[2]&&a[i+1]==num[1])||(a[i]==num[1]&&a[i+1]==num[2])) 
				cnt[2]++;//宽高 
		}
		//cout<<cnt[0]<<endl<<cnt[1]<<endl<<cnt[2]<<endl;
		if((cnt[0]==2&&cnt[1]==2&&cnt[2]==2)||cnt[0]==4||cnt[1]==4||cnt[2]==4||cnt[0]==6)
		{
			printf("POSSIBLE\n");
		 } 
		 else{
		 	printf("IMPOSSIBLE\n");
		 }
	
}
return 0;
}

最后:做了几道题目,总结了一下,觉得while(1) 不要乱用,容易死循环,如果用,一定要记得有break条件。

噢对,还有最重要的一点,想思路的时候不能光看一种,多想一些特殊情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值