UVa 1587 Box (判断长方体)

UVa 1587 Box (判断长方体)_第1张图片UVa 1587 Box (判断长方体)_第2张图片UVa 1587 Box (判断长方体)_第3张图片


题意:

给出六个矩形的长和宽,判断这六个矩形能不能构成长方体。

思路:

符合条件的情况只有三种:
①只出现一种数字
②出现两种数字

  • 一种出现4次一种出现8次
  • 6个矩形中有2个正方形,剩下4个是相同的矩形
  • 四个相同的矩形即意味着长宽不等
③出现三种数字且每种都只出现4次

  • 每种数字都出现了4次
  • 每个矩形都长宽不等


第一次,只考虑了两种情况(一种数字或三种数字),而且在三种数字这种情况下只是简单的用【每种数字都出现4次】限定,

WA了。

又推倒重写,半个小时才写完第二版,(⊙﹏⊙),这下才AC了~

AC代码如下。

#include 
int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);
	int a[6][2], b[12];
	int i, j, k, p;
	int flag, sum;
	while (~scanf("%d%d", &a[0][0], &a[0][1]))
	{
		for (i = 1;i < 6;i++)
			scanf("%d%d", &a[i][0], &a[i][1]);
		b[0] = a[0][0];
		j = flag = 0;
		for (i = 0;i < 6;i++)
		{
			for (p = 0;p < 2;p++)
			{
				for (k = 0;k <= j;k++)
					if (a[i][p] == b[k]) break;
				if (k > j) b[++j] = a[i][p];//b[j]保存每种数字
			}
			 
		}
		if (j == 0) flag = 1;//只有一种数字,即正方体
		else if (j == 1)
		{
			sum = 0;
			for (i = 0;i < 6;i++)
			{
				if (a[i][0] == b[0]) sum++;
				if (a[i][1] == b[0]) sum++;
			}
			if (sum == 4||sum==8)  flag = 1;//首先需要满足一个数字出现4次,另一个出现8次
			if (flag)//还需满足有两个是正方形,另外四个是相同的矩形
			{
				flag = 0;
				for (i = 0;i < 6;i++)
					if (a[i][0] == a[i][1]) flag++;
				if (flag == 2)//两个正方形
				{
					flag = 0;
					for (i = 0;i < 6;i++)
						if (a[i][0] != a[i][1]) flag++;
					if (flag == 4) flag = 1;//剩下四个长宽不等的矩形
					else flag = 0;
				}
				else flag = 0;
			}
		}
		else if (j == 2)
		{
			for (i = 0;i < 3;i++)
			{
				sum = 0;
				for (k = 0;k < 6;k++)
				{
					if (a[k][0] == b[i]) sum++;
					if (a[k][1] == b[i]) sum++;
				}
				if (sum == 4) flag++;
			}
			if (flag == 3)//每种都出现了四次
			{
				flag = 0;
				for (i = 0;i < 6;i++)
					if (a[i][0] != a[i][1]) flag++;
				if (flag == 6) flag = 1;
				else flag = 0;
			}
			else flag = 0;
		}
		if (flag) printf("POSSIBLE\n");
		else printf("IMPOSSIBLE\n");
	}
	return 0;
}




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