题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=130
题意:一个雪花有六个角,每个角对应一个值,给出N个雪花,问能不能是否存在两片相同的雪花(给出的角可能是逆序的);
解题思路:由于有很多雪花,因此数据很大,如果单纯的进行直接查询的话肯定会TE,因此可以用哈希的方法,其中哈希函数可以用每个雪花的各个角的和来定义;然后映射到相应的位置。一旦找到就不在进行哈希。
#include<iostream>
#include<cstdio>
using namespace std;
struct snow
{
int a[6];
struct snow *next;
};
snow *s[100005];
bool fun(int b[],int sum)
{
snow *p;p=s[sum]->next;
while(p)
{
for(int i=0;i<6;i++)
{
if(b[i]==p->a[0])
{
int j;
for(j=1;j<6;j++)
{
if(b[(i+j)%6]!=p->a[j])break;
}
if(j==6)return true;
for(j=1;j<6;j++)
{
if(b[((i-j)%6+6)%6]!=p->a[j])break;
}
if(j==6)return true;
}
}
p=p->next;
}
p=new snow;
for(int i=0;i<6;i++)
{
p->a[i]=b[i];
}
p->next=s[sum]->next;
s[sum]->next=p;
return false;
}
int main()
{
int n;cin>>n;
while(n--)
{
int m;cin>>m;
for(int i=0;i<100000;i++)
{
s[i]=new snow;s[i]->next=NULL;
}
int flat=1;
for(int i=0;i<m;i++)
{
int b[6];int sum=0;
for(int j=0;j<6;j++)
{
scanf("%d",&b[j]);sum+=b[j];
}
sum%=100000;
if(flat)
{
if(fun(b,sum)) flat=0;
}
}
if(!flat)printf("Twin snowflakes found.\n");
else printf("No two snowflakes are alike.\n");
}
}