这……感觉我没有领悟哈希的精髓吧,竟然要3秒多,还是不写什么解析了,后面继续悟悟吧
#include<iostream>
#include<string>
#define M 99999
using namespace std;
struct snow
{
int v;
int flake[6];
struct snow *next;
};
struct snow *s[M];
int vis[M];
int ok;
int hash(int f[])
{
int sum=0;
for(int i=0;i<6;i++)
sum+=f[i];
return sum%M;
}
int jude(int f1[],int f2[])
{
int i,j,m,k;
for(i=0;i<6;i++)
{
if(f2[0]==f1[i])
{
for(k=0,m=1,j=i+1;j<=i+5;j++,m++)
if(f2[m]!=f1[j%6])
break;
if(m==6) return 1;
for(k=0,m=1,j=i-1;j>=i-5;j--,m++)
if(f2[m]!=f1[(j+6)%6])
break;
if(m==6) return 1;
}
}
return 0;
}
void insert(struct snow *ss,int f[])
{
while(ok==0)
{
if(ss->v==0)
{
ss->v=1;
ss->next=new struct snow;
for(int i=0;i<6;i++)
ss->flake[i]=f[i];
ss->next->v=0;
ss->next->next=NULL;
break;
}
else
{
if(jude(ss->flake,f))
ok=1;
ss=ss->next;
}
}
}
int main()
{
int n,i,j,f[6],h;
memset(vis,0,sizeof(vis));
scanf("%d",&n);
ok=0;
for(i=0;i<n;i++)
{
for(j=0;j<6;j++)
scanf("%d",&f[j]);
if(ok==0)
{
h=hash(f);
if(vis[h]==0)
{
vis[h]=1;
s[h]=new struct snow;
s[h]->v=0;
s[h]->next=NULL;
}
insert(s[h],f);
}
}
if(ok)
printf("Twin snowflakes found.\n");
else
printf("No two snowflakes are alike.\n");
return 0;
}