第一次用hash解决问题,hash的结构很巧妙,因为是要找到两个相同的元素,出发点是和相同的话,有可能相同,将和相同的元素放在一个集合,再进行进一步的判断,
这样的话很明显就是用了hash的地址冲突的解决方法,解决地址冲突的方法,可以用链表法,但是不局限于链表,用顺序容器也是可以解决的。
#include <iostream>
#include <vector>
#define Max_Num 90001
#define Max_Size 100003
using namespace std;
vector<int> hash[Max_Num+1];
int snow[Max_Size][6];
int isSame(int a[],int b[])
{
for(int j=0;j<6;j++)
{
if(a[0]==b[j]&&a[1]==b[(j+1)%6]&&a[2]==b[(j+2)%6]&&a[3]==b[(j+3)%6]&&
a[4]==b[(j+4)%6]&&a[5]==b[(j+5)%6])
return 1;
else if(a[0]==b[j]&&a[1]==b[(j+5)%6]&&a[2]==b[(j+4)%6]&&a[3]==b[(j+3)%6]&&
a[4]==b[(j+2)%6]&&a[5]==b[(j+1)%6])
return 1;
}
return 0;
}
int main()
{
int num,i=0;
cin >>num;
while (i<num)
{
int sum=0;
for (int j=0;j<6;j++)
{
scanf("%d",&snow[i][j]);
sum+=snow[i][j];
}
int key=sum%Max_Num;
for (vector<int>::iterator iter=hash[key].begin();iter!=hash[key].end();++iter)
{
if(isSame(snow[i],snow[*iter]))
{
printf("Twin snowflakes found.\n");
return 0;
}
}
hash[key].push_back(i);
++i;
}
printf("No two snowflakes are alike.\n");
}