#include<iostream><br />#include<cstring><br />#include<algorithm><br />using namespace std;<br />const int MAXHASH = 100003;<br />bool vis[MAXHASH];<br />bool ok;<br />int state[MAXHASH][6];//存放雪花形狀的狀態<br />int head[MAXHASH],next[MAXHASH];<br />int n;<br />unsigned int hash(int st[])//求和模數的雜湊函數<br />{<br />unsigned int h = 0;<br />for(int i = 0;i < 6;++i)<br />h += st[i];<br />return h % MAXHASH;<br />}<br />void checkCollision(int h)//檢測衝突<br />{<br />for(int i = head[h];i != -1;i = next[i])//枚舉<br />{<br />for(int j = next[i];j != -1;j = next[j])<br />{<br />int a[6],b[6];//一個正時鐘方向,一個逆時鐘方向<br />for(int k = 0;k < 6;++k)<br />{<br />for(int x = k,y = 0;y < 6;++y,++x)//枚舉12種旋轉方式<br />a[y] = state[i][x % 6];<br />memcpy(b,a,sizeof(a));<br />reverse(b,b + 6);//反向<br />if(memcmp(a,state[j],sizeof(a)) == 0)//如果在雜湊鏈表中發現相同的,則說明有衝突<br />{<br />ok = 0;<br />return;<br />}<br />if(memcmp(b,state[j],sizeof(b)) == 0)<br />{<br />ok = 0;<br />return;<br />}<br />}<br />}<br />}<br />}<br />int main()<br />{<br />//freopen("in.txt","r",stdin);<br />scanf("%d",&n);<br />memset(head,-1,sizeof(head));<br />ok = 1;<br />int st[6];<br />for(int i = 1;i <= n;++i)<br />{<br />for(int j = 0;j < 6;++j)<br />scanf("%d",&state[i][j]);<br />int h = hash(state[i]);<br />next[i] = head[h];//逆序插入雜湊表頭<br />head[h] = i;<br />}<br />for(int h = 0;h < MAXHASH;++h)<br />{<br />if(!ok)break;<br />if(head[h] != -1)//如果雜湊表頭不為空白<br />checkCollision(h);//檢測衝突<br />}<br />if(ok)printf("No two snowflakes are alike./n");<br />else printf("Twin snowflakes found./n");<br />return 0;<br />}