原题地址:http://poj.org/problem?id=3349
参考博文:http://blog.csdn.net/lyy289065406/article/details/6647351
<span style="font-size:18px;">#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define prime 999983 //100000
#define len 6
typedef struct
{
long int a[len];
}SNOW;
typedef struct Hash
{
long int size[len];
Hash* next;
}HashTable;
HashTable* hash[prime]; //存放计算出来的哈希值
long int hashkey(SNOW& snow) //哈希函数,用来计算键值
{
int i;
long int key=0;
for(i=0;i<len;++i)
key+=snow.a[i];
key=key%prime;
return key;
}
//判断两个键值相同的雪花是否各个角长度也一样
bool Issame(SNOW s,HashTable* h)
{
int n,i,j;</span>
<span style="font-size:18px;"> for(n=0;n<len;++n) //顺时针
{
for(i=n,j=0;j<len;++j,i=(i+1)%len)
{
if(h->size[j]!=s.a[i])
break;
}
if(j==len)
return true;
}
//逆时针
for(n=0;n<len;++n)
{
for(i=n,j=0;j<len;++j,i=(i+5)%len)
{
if(h->size[j]!=s.a[i])
break;
}
if(j==len)
return true;
}
return false;
}
//插入雪花
bool insert(SNOW s)
{
long int tempkey=hashkey(s);
if(!hash[tempkey])
{
HashTable *temp=new HashTable;
for(int i=0;i<len;++i)
{
temp->size[i]=s.a[i];
}
hash[tempkey]=temp;
}
else
{
HashTable *temp=hash[tempkey];
if(Issame(s,temp))
return true;
while(temp->next) //找出链表中已经存在的雪花
{
temp=temp->next;
if(Issame(s,temp))
return true;
}
HashTable *next=new HashTable;
for(int i=0;i<len;++i)
{
next->size[i]=s.a[i];
}
temp->next=next;
}
return false;
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
long int n,m;
bool flag=false;
cin>>n;
for(long int i=0;i<n;++i)
{
SNOW s;
for(int j=0;j<len;++j)
{
cin>>m;
s.a[j]=m;
}
flag=insert(s);
if(flag)
{
cout<<"Twin snowflakes found\n";
break;
}
}
if(!flag)
cout<<"No two snowflakes are alike";
fclose(stdin);
fclose(stdout);
return 0;
}</span>