寫這道題目時,發現自己也像其它人一樣不會寫Hash演算法,沒辦法,去網上找了個別人的演算法來,哎.....不過是自己認真寫的,真的很意義!!!
寫這個題目後,發現自己對資料結構中散列表尋找——連結法,有了新的認識,真是個好東西啊!!呵呵。。。
#include<iostream><br />using namespace std; </p><p>const int MAX = 100000;<br />const int P = 33119;</p><p>int data[MAX][6];</p><p>struct link<br />{<br />int n;<br />link *next;<br />}Hash[P];</p><p>int compare(int a[], int b[])<br />{<br />for(int i=0; i<6; i++)<br />if(a[i] < b[i])<br />return -1;<br />else if(a[i] > b[i])<br />return 1;<br />return 0;<br />}</p><p>void g(int data[])<br />{</p><p>int i,j,k;<br />int a[6],b[6];<br />for(i=0; i<6; i++)<br />a[i] = data[i];</p><p>for(i=1; i<6; i++)<br />{<br />for(k=0; k<6; k++)<br />b[k] = data[(i+k)%6];</p><p>if(compare(b,a) == -1)<br />{<br />for(k = 0; k < 6; k++)<br />a[k] = b[k];<br />}<br />}<br />if(compare(a, data) == -1)<br />for(k = 0; k < 6; k++)<br />data[k] = a[k];</p><p>int c[6];<br />for(k = 0; k < 6; k++)<br />c[k] = data[5-k];</p><p>for(k = 0; k < 6; k++)<br />a[k] = c[k];</p><p>for(i=1; i<6; i++)<br />{<br />int b[6];<br />for(k=0; k<6; k++)<br />b[k] = c[(i+k)%6];</p><p>if(compare(b,a) == -1)<br />{<br />for(k = 0; k < 6; k++)<br />a[k] = b[k];<br />}<br />}<br />if(compare(a, data) == -1)<br />for(k = 0; k < 6; k++)<br />data[k] = a[k];<br />}</p><p>int main()<br />{<br />int i,j,k;</p><p>int t;<br />scanf("%d",&t);<br />bool flag = false;</p><p>for(i=0; i<t; i++)<br />{<br />for(j=0; j<6; j++)<br />scanf("%d", &data[i][j]);</p><p>if(flag == true)<br />continue;</p><p>g(data[i]);</p><p>k = 0;<br />for(j=0; j<6; j++)<br />k += data[i][j];<br />k = k%P;</p><p>link * p = &Hash[k];</p><p>while(p->next != NULL)<br />{<br />p = p->next;<br />int index = p->n;<br />if(compare(data[i], data[index]) == 0)<br />flag = true;<br />}</p><p>p->next = new link;<br />p->next->n = i;<br />p->next->next = NULL;<br />}</p><p>if (flag) cout << "Twin snowflakes found./n";<br /> else cout << "No two snowflakes are alike./n";<br />//system("pause");<br />return 0;<br />}