盒子题目(Box)ACM

算法竞赛入门经典

习题3-10 盒子(Box, ACM/ICPC NEERC 2004, UVa1587)

给定6个矩形的长和宽wi和hi(1≤wi,hi≤1000),判断它们能否构成长方体的6个面。

分析:此题可转化为二维数组解答,二维数组的每行存每个面的的长与宽,即数组中每个数代表每条边;如下图
盒子题目(Box)ACM_第1张图片
此题重点不能忽略正方体属于特殊的长方体,只需将每条边进行对比即可
若可以组成长方体,则必定存在四个相等的面,他们的长相等(这是找出四个面的关键),这四个面的宽的和必定等于另外两个面(侧面)的周长,这是程序判断是否能构成长方体的基本思想,结合下图理解

盒子题目(Box)ACM_第2张图片

C语言代码:

#include
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;
}

总结:做此类题必须数图结合寻找突破口

你可能感兴趣的:(刷题)