poj 3349 Snowflake Snow Snowflakes
题意:给你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; }
不怕路长,只怕心老.