第一次做哈希 直接搜的题解,就当是照着葫芦画瓢吧代码如下~~~~
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
typedef struct node
{
int a[6];
}item;
item snow[15000][20];//p为14997
int m[15000];//记录冲突的个数
int hash(item x)
{
int key = 0;
for(int i = 0;i < 6;i++){
key += x.a[i];
}
return key%14997;
}
int cmp(item x, item y)
{
int i, j, k;
for(k = 0;k < 6;k++){
for(i = k,j = 0;j < 6;j++,i = (i+1)%6){
if(x.a[i]!=y.a[j]){
break;
}
}
if(j == 6) return 1;
}
for(k = 0;k < 6;k++){
for(i = k, j = 0;j < 6;j++,i = (i+5)%6){
if(x.a[i]!=y.a[j]) break;
}
if(j == 6) return 1;
}
return 0;
}
int main()
{
int n;
int i, j, pos;
scanf("%d", &n);
item temp;
for(i = 1;i <= n;i++){
for(j = 0;j < 6;j++){
scanf("%d", &temp.a[j]);
}
pos = hash(temp);
for(j = 0;j < m[pos];j++){
if(cmp(temp,snow[pos][j])){//比较是否相同
printf("Twin snowflakes found.\n");//找到相同的就直接输出
return 0;
}
}
snow[pos][j] = temp;//如果之前不存在,那就加入到pos地址中去
m[pos]++;//pos地址加1
}
printf("No two snowflakes are alike.\n");
return 0;
}