哈希算法之二

//poj 3349 Snowflake Snow Snowflakes

#include
<iostream> //哈希函数,拉链法
#include<vector>
using namespace std;
const int mv=99991;
int data[100002][6];
vector
<int> hash[100002];

bool same(int a[6],int b[6])
//a[]的下标j总是从0到6,固定a,而b[]的起始下标i从0到6,绕顺时针(向右)和逆时针旋转
{
int tag;
for(int i=0;i<6;++i)
{
tag
=0;
for(int j=0;j<6;++j)
{
if(a[j]!=b[(j+i)%6]) //b绕顺时针(向右)
{
tag
=1;break;
}
}
if(tag==0)
return true;
}
for(int i=0;i<6;++i)
{
tag
=0;
for(int j=0;j<6;++j)
{
if(a[j]!=b[(-j+i+6)%6]) //b绕逆时针
{
tag
=1;break;
}
}
if(tag==0)
return true;
}
return false;
}
int main()
{
int n,i,j,sum;
scanf(
"%d",&n);
for(i=1;i<=n;++i)
for(j=0;j<6;++j)
scanf(
"%d",&data[i][j]);
for(i=1;i<=n;++i)
{
sum
=0;
for(j=0;j<6;++j)
sum
+=data[i][j];
sum
%=mv;
if(hash[sum].size()>0)
{
for(j=0;j<hash[sum].size();++j)
{
int k=hash[sum][j];
if(same(data[i],data[k]))
{
printf(
"Twin snowflakes found.\n");
return 0;
}
}
}
hash[sum].push_back(i);
}
printf(
"No two snowflakes are alike.\n");
return 0;
}

  

posted on 2011-08-22 15:02  sysu_mjc  阅读(194)  评论(0编辑  收藏  举报

导航