3-10 uva 1587 box

背景:昨晚开始想这个题目,感觉思路不是很清晰,但还是动笔了,几组过了之后交了果然wa,觉得思路是在非常混乱。就去看了人家的题解。。。。结果后来还因为访问非法内存而错了。。。

学习:此题主要在于判断是否最后可以合并为三个矩形,如果可以再对情况进行枚举,,,或者用一个更快的方法就是用sort将三组数据进行排序,找出满足长方体的规律。

感觉自己还是太渣渣渣了,好多该掌握的都还没掌握清楚。。。 这题也必须再回来写一次。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; 
struct  r
{
	int w;
	int h;
}box[10],mark[4];
void swap(int* a,int* b)
{
	int t = *a;
	*a = *b;
	*b = t;
}
bool cmp (struct r n,struct r m)    //sort 函数的比较函数 
{
  	if(n.w!=m.w) return n.w < m.w;    //升序用< 
  	else return n.h < m.h;
}
int main ()
{
	memset(box,0,sizeof(box));
	while (1)
	{
		int i,j;
		int flag=0,n=0;
		for(i=0;i<6;i++)
		{
			if(scanf("%d%d",&box[i].w,&box[i].h)!=2)
			goto out;
			if(box[i].w > box[i].h)       //如果前一个比较大 就要放到后面以保证前一个是宽后一个是长 
			swap(&box[i].w,&box[i].h);
		}
		for(i=0;i<5;i++)
		{
			for(j=i+1;j<6;j++)
			{
				if(!box[i].w)
				continue;
				if(box[i].w == box[j].w && box[i].h == box[j].h )
				{
					mark[n].w = box[i].w ;
					mark[n++].h = box[i].h ;     //如果相同将其放入mark数组中 
					box[j].w = 0;
					break;            //必须break 否则会影响有一对正方形的那种情况  因为会有四组一样的 
				}
			}
		}
		if(n==3)
		{
			sort(mark,mark+3,cmp);    //第二个参数加的值只与数组个数有关,一开始没记清楚以为和成员个数也有关 +6了 结果直接访问了非法内存吧 数组的值都被改了orz 
			if(mark[0].w == mark[1].w && mark[0].h == mark[2].w && mark[1].h == mark[2].h )    //排序后的三组数据必须满足这个才是长方体  可以多试几组检验orz 
			flag=1;
		}
		if(flag==1)
		printf("POSSIBLE\n");
		else if(flag==0)
		printf("IMPOSSIBLE\n");
	}
	out:
	return 0;
} 


你可能感兴趣的:(3-10 uva 1587 box)