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

题意就是判断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条件。

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

发布了17 篇原创文章 · 获赞 0 · 访问量 468

猜你喜欢

转载自blog.csdn.net/weixin_43786756/article/details/94901693