習題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;
}
發佈了25 篇原創文章 · 獲贊 25 · 訪問量 891
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章