这是一个典型的找规律的题,看着很难,其实规律一出来就是典型的利用数组下标的题目;
很简单,按照边在12个长宽出现的次数和出现在几个矩形里来判定就行了
规律如下:
总共出现一个长度,满足情况
总共出现两个长度,则其中一个长度在12个数里出现4次,并在四个矩形中出现
总共出现三个长度,则必须每个长度都出现4次,并在四个矩形中出现
题目详情
代码一:
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 10010
using namespace std;
struct Data{
int x,y;
};
int main()
{
struct Data n[10];
int a[N];//存放该边长度的种类
int b[N];//存放该边出现的次数
int c[N];//存放该边在几个矩形中出现
while(cin>>n[0].x>>n[0].y>>n[1].x>>n[1].y>>n[2].x>>n[2].y>>n[3].x>>n[3].y>>n[4].x>>n[4].y>>n[5].x>>n[5].y)
{
int find=0;
int num=0;//种类数
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(int i=0;i<6;i++)
{
if(a[n[i].x]==0)
a[n[i].x]=++num;
if(a[n[i].y]==0)
a[n[i].y]=++num;
b[a[n[i].x]]++;
b[a[n[i].y]]++;
c[a[n[i].x]]++;
if(n[i].x!=n[i].y)
c[a[n[i].y]]++;
}
if(num==1)
find=1;
else if(num==2)
{
if((b[1]==4&&c[1]==4)||(b[2]==4&&c[2]==4))
find=1;
}
else if(num==3)
{
if(b[1]==4&&c[1]==4&&b[2]==4&&c[2]==4&&b[3]==4&&c[3]==4)
find=1;
}
printf(find?"POSSIBLE\n":"IMPOSSIBLE\n");
}
return 0;
}
代码二:
与代码一在数据的输入处理上相比更加简单:利用scanf的返回值,每次判断两个数据
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 10010
using namespace std;
int main()
{
int a[N];
int b[N];
int c[N];
int m,n;
while(true)
{
int find=0;
int num=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(int i=0;i<6;i++)
{
if(scanf("%d%d",&m,&n)!=2)//一定要这样写,否则会时间超限
return 0;
if(a[m]==0)
a[m]=++num;
if(a[n]==0)
a[n]=++num;
b[a[m]]++;
b[a[n]]++;
c[a[m]]++;
if(n!=m)
c[a[n]]++;
}
if(num==1)
find=1;
else if(num==2)
{
if((b[1]==4&&c[1]==4)||(b[2]==4&&c[2]==4))
find=1;
}
else if(num==3)
{
if(b[1]==4&&c[1]==4&&b[2]==4&&c[2]==4&&b[3]==4&&c[3]==4)
find=1;
}
printf(find?"POSSIBLE\n":"IMPOSSIBLE\n");
}
return 0;
}