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

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

题意

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

思路

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

代码如下:

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

你可能感兴趣的:(《算法竞赛入门经典(第2版)》)