题意就是判断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条件。
噢对,还有最重要的一点,想思路的时候不能光看一种,多想一些特殊情况