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

原题链接:https://vjudge.net/problem/UVA-1587
分类:数组
备注:思维

题意

  每行给出两个数表示一个矩形的两条边,六行为一组,以表示一个长方体,判断长方体是否能构成。

思路

  • 长方体的边中最多出现3种不同数,如果超过则无法构成。
  • 每条边的数出现次数都为4的整数倍。
  • 边出现不同数的种类可能为1、2、3种。
  • 如果只有一种直接成立。
  • 如果出现两种,则两个数分别为8个和4个,多者要组成两个正方形,剩下的与少者配对成长方形。
  • 出现三种则必定每个矩形的边长不一样。

代码如下:

#include<stdio.h>
int main(void)
{
	int a[6][2];
	while (scanf("%d%d", &a[0][0], &a[0][1]) == 2)
	{
		int flag = 1, cnt = 0, num[15], haved[10005] = { 0 };
		for (int i = 1; i <= 5; i++)scanf("%d%d", &a[i][0], &a[i][1]);
		for (int i = 0; i <= 5; i++)
		{
			if (!haved[a[i][0]]) { haved[a[i][0]] = 1; num[cnt++] = a[i][0]; }
			else haved[a[i][0]]++;
			if (!haved[a[i][1]]) { haved[a[i][1]] = 1; num[cnt++] = a[i][1]; }
			else haved[a[i][1]]++;
		}
		for (int i = 0; i < cnt; i++)if (haved[num[i]] % 4)flag = 0;//如果有数出现次数不为4的整数倍则IMPOSSBILE
		if (!flag) { printf("IMPOSSIBLE\n"); continue; }
		if (cnt == 1) { printf("POSSIBLE\n"); continue; }//如果出现次数都为4的整数倍,12个数最多有3种不同
		int no = 0;
		for (int i = 0; i <= 5; i++)if (a[i][0] == a[i][1])no++;
		if (cnt == 3)
		{//如果3种不同的数,每个矩形必定要两边不相等
			if (no)printf("IMPOSSIBLE\n");
			else printf("POSSIBLE\n");
		}//如果有2种不同数,一个数有8个,另一个数有4个,则数少者必须和数多者配对,数多者要正好多出两个正方形
		else if (no == 2)printf("POSSIBLE\n");
		else printf("IMPOSSIBLE\n");
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JILIN.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值