背景:昨晚开始想这个题目,感觉思路不是很清晰,但还是动笔了,几组过了之后交了果然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;
}