UVA 1587 BOX 盒子 六个面构成长方体

这是一个典型的找规律的题,看着很难,其实规律一出来就是典型的利用数组下标的题目;
很简单,按照边在12个长宽出现的次数和出现在几个矩形里来判定就行了
规律如下:
总共出现一个长度,满足情况
总共出现两个长度,则其中一个长度在12个数里出现4次,并在四个矩形中出现
总共出现三个长度,则必须每个长度都出现4次,并在四个矩形中出现
题目详情

代码一:

#include
#include
#include
#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
#include
#include
#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;
 } 

你可能感兴趣的:(紫皮书习题,scanf返回值,每次判断两个数)