算法竞赛入门经典
习题3-10 盒子(Box, ACM/ICPC NEERC 2004, UVa1587)
给定6个矩形的长和宽wi和hi(1≤wi,hi≤1000),判断它们能否构成长方体的6个面。
分析:此题可转化为二维数组解答,二维数组的每行存每个面的的长与宽,即数组中每个数代表每条边;如下图
此题重点不能忽略正方体属于特殊的长方体,只需将每条边进行对比即可
若可以组成长方体,则必定存在四个相等的面,他们的长相等(这是找出四个面的关键),这四个面的宽的和必定等于另外两个面(侧面)的周长,这是程序判断是否能构成长方体的基本思想,结合下图理解
C语言代码:
#include<stdio.h>
int main()
{
int a[6][2],b[4],k=0,i,j,t,sum1=0,sum2=0,len=0;//t用来标记相等的四个面的长度,b[4]存放四个相等的面的行下标
for(i=0;i<6;i++)
{
for(j=0;j<2;j++)
scanf("%d",&a[i][j]);
}
t=a[0][0];//将输入的第一个面定为四个面的长
for(i=0;i<6;i++) //排除是正方形的情况
for(j=0;j<2;j++)
if(a[i][j]==t)
len++;
if(len==12)//正方形12条边相等
{
printf("YES\n");
return 0;
}
for(i=0;i<6;i++)
{
if(a[i][0]==t)//找出四个相等的面,行下标存放在b[k]数组中
{
b[k]=i;
k++;
}
if(k==4)
break;
}
if(k!=4)//未找到四个相等的面,构不成长方体
{
printf("NO\n");
return 0;
}
else
{
for(i=0;i<4;i++)
sum1+=a[b[i]][1];//sum1为四个相等的面宽的和
for(i=0;i<6;i++)
{
if(a[i][0]!=t)
{
for(j=0;j<2;j++)
sum2+=a[i][j];//sum2为长方体侧面的周长,转化为两侧面的长与宽的和
}
}
}
if(sum1==sum2)//当相等的四个面(前后上下)的宽的和与侧面周长相等时,则可构成正方体
printf("yes\n");
else
printf("NO\n");
return 0;
}
总结:做此类题必须数图结合寻找突破口