这个寒假开始acm集训,有的时候觉得自己在C语言方面实在不行……像这个题做了很长时间,WA了n次,主要还是没考虑特殊数据,想当然了。
题目要求:输入六行宽和高,判断六个长方形能否组成长方体。
思路:六组数据中,每组数据先按从大到小顺序排序(长方形宽就是高,高就是宽);六组数据冒泡排序(PS:排序是整行换位),第一列从大到小,相同时比较第二列。
事实上,设长方体的长、宽、高分别为a、b、c,a>=b&&b>=c,排序后一定会是
a b
a b
a c
a c
b c
b c
之后就是暴力判断。。。如果有好方法请留言……
#include<stdio.h>
int sortwh(int w[6],int h[6])
{
int i=0,k,t=0,t1=0,t2=0;
for(i=0;i<6;i++)
{
if(w[i]<h[i])
{
t=w[i];w[i]=h[i];h[i]=t;
}
}
for(k=1;k<=5;k++)
for(i=0;i<6-k;i++)
{
if(w[i]<w[i+1]||(w[i]==w[i+1]&&h[i]<h[i+1]))
{
t1=w[i];w[i]=w[i+1];w[i+1]=t1;
t2=h[i];h[i]=h[i+1];h[i+1]=t2;
}
}
i=0;
if(w[0]==w[1]&&w[1]==w[2]&&w[2]==w[3]&&w[4]==w[5]&&w[5]==h[0]&&h[0]==h[1]&&h[2]==h[3]&&h[3]==h[4]&&h[4]==h[5])
return 1;
else return 0;
}
int main()
{
int w1[6]={0},h1[6]={0},j,ans=0;
while(scanf("%d %d",&w1[0],&h1[0])!=EOF)
{
for(j=1;j<6;j++)
scanf("%d %d",&w1[j],&h1[j]);
for(j=0;j<6;j++)
if(w1[j]<=0||w1[j]>10000||h1[j]<=0||h1[j]>10000)
return 0;
ans=sortwh(w1,h1);
if(ans) printf("POSSIBLE\n");
else printf("IMPOSSIBLE\n");
}
return 0;
}
测试用例:
1345 2584 2584 683 2584 1345 683 1345 683 1345 2584 683 POSSIBLE 1 3 1 3 1 2 1 2 1 1 1 1 IMPOSSIBLE 1 1 1 1 1 2 1 2 1 2 1 2 POSSIBLE 1 1 1 1 1 2 1 2 2 2 2 2 IMPOSSIBLE 1 1 1 1 9999 9999 9999 9999 9999 9999 9999 9999 IMPOSSIBLE 1 3 1 3 2 4 2 4 3 4 3 4 IMPOSSIBLE 1345 2584 2584 683 2584 1345 683 1345 683 683 1345 2584 IMPOSSIBLE 1 2 2 3 2 1 3 1 3 3 1 2 IMPOSSIBLEPS:从poj的discuss中粘贴的。