题意:给你n个堆数据,每堆有六个数,堆与堆之间要顺时针或逆时针相等,问是否有两堆相等
哈希直接算了。
#include <iostream>
#include <cstdio>
#include<cstring>
using namespace std;
#define N 1200010
struct node{
int num[6];
int next;
}p[N];
int cur ,hashTable[N];
void initHash(){
cur=0;
memset(hashTable,-1,sizeof(hashTable));
}
int getHash(int *num){
int hash=0;
for(int i=0;i<6;i++)
hash+=num[i];
return hash%N;
}
bool cmp(int *num1,int *num2){
for(int i=0;i<6;i++)
if(num1[i]!=num2[i])
return false;
return true;
}
void insertHash(int *num,int h){
for(int i=0;i<6;i++)
p[cur].num[i]=num[i];
p[cur].next=hashTable[h];
hashTable[h]=cur;
++cur;
}
bool SearchHash(int *num){
int h=getHash(num);
int next=hashTable[h];
while(next!=-1){
if(cmp(num,p[next].num))
return true;
next=p[next].next;
}
insertHash(num,h);
return false;
}
int main(int argc, char** argv) {
int num[2][12],n;
bool flag=0;
initHash();
scanf("%d",&n);
while(n--){
for(int i=0;i<6;i++){
scanf("%d",&num[0][i]);
num[0][i+6]=num[0][i];
}
if(flag)
continue;
for(int i=0;i<6;i++){
num[1][i+6]=num[1][i]=num[0][5-i];
}
for(int i=0;i<6;i++){
if(SearchHash(num[0]+i)||SearchHash(num[1]+i)){
flag=1;
break;
}
}
}
if(!flag)
puts("No two snowflakes are alike.");
else
puts("Twin snowflakes found.");
return 0;
}