`

南阳理工OJ 130 相同的雪花 哈希

 
阅读更多
/*
一个雪花是一个结构体,输入一个雪花先预处理一下
就是找出雪花的最小序列,
再用sort函数对雪花排序(利用运算符重载可以给结构体排序)
然后再找有没有重复的雪花
*/
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
	int a[6];
}xue[100010],term,term1,term2;
bool operator < (const node &x,const node &y)
{
	for(int i=0;i<5;i++)if(x.a[i]!=y.a[i])return x.a[i]<y.a[i];
	return x.a[5]<y.a[5];
}
bool operator == (const node &x,const node &y)
{
	return((x.a[0]==y.a[0])&&(x.a[1]==y.a[1])&&(x.a[2]==y.a[2])&&(x.a[3]==y.a[3])&&(x.a[4]==y.a[4])&&(x.a[5]==y.a[5]));
}
int main()
{
	int T,n,i,j,f,min,k;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(i=0;i<n;i++)
		{
			for(j=0;j<6;j++)scanf("%d",&term.a[j]);//输入一片雪花
			xue[i]=term;
			for(j=0,min=(1<<31)-1;j<6;j++)if(term.a[j]<min)min=term.a[j];//找出最小的一枝
			for(j=0;j<6;j++)
				if(term.a[j]==min)//找出最小的序列
				{
					for(k=0;k<6;k++)term1.a[k]=term.a[(j+k)%6];//顺时针
					if(term1<xue[i])xue[i]=term1;
					for(k=0;k<6;k++)term2.a[k]=term.a[(j-k+6)%6];//逆时针
					if(term2<xue[i])xue[i]=term2;
				}
		}
		sort(xue,xue+n);//排序
		for(f=0,i=1;i<n;i++)
		{
			if(xue[i]==xue[i-1])//有一样就的跳出
			{
				f=1;
				break;
			}
		}
		if(f)printf("Twin snowflakes found.\n");//输出
		else printf("No two snowflakes are alike.\n");
	}
	return 0;
}

 

1
10
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics