poj 3349 雪花
生活随笔
收集整理的這篇文章主要介紹了
poj 3349 雪花
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目大意:每片雪花有 6 個角長度的值,對于不同的雪花而言,這些值可能被反轉,并且開頭的長度未必是一致的
例如 1 2 3 4 5 6和 4 3 2 1 6 5,雖然他們表面上不同,但是經過反轉和偏移以后,就是相同的雪花。?
在輸入數據中如果有相同的雪花,則輸出yes,否則輸出no。
這個題目為什么適合用哈希表呢,個人覺得主要一個原因是數據不好排序,因為六片花瓣順序被打亂了,如果數據不能有效的排序,自然就不能有效的檢索。
但是這些數據雖然 卻可以比較容易找到一個哈希函數,將 被打亂的相同數據 映射到同一個哈希值上。 然后在針對小規模的數據做檢索,能很高的提高效率。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define mod 99983 using namespace std; struct node {node(): next(NULL){}int snow[6];struct node *next; }hash[100001]; int a[6]; void add(int key) {node *p=new node;for(int i=0;i<6;++i)p->snow[i]=a[i];p->next=hash[key].next;hash[key].next=p; } bool find(int key) {node *p=hash[key].next;while(p!=NULL){for(int i=0;i<6;++i)if((a[0]==p->snow[i]&&a[1]==p->snow[(i+1)%6]&&a[2]==p->snow[(i+2)%6]&&a[3]==p->snow[(i+3)%6]&&a[4]==p->snow[(i+4)%6]&&a[5]==p->snow[(i+5)%6])||a[0]==p->snow[i]&&a[1]==p->snow[(i+5)%6]&&a[2]==p->snow[(i+4)%6]&& a[3]==p->snow[(i+3)%6]&&a[4]==p->snow[(i+2)%6]&&a[5]==p->snow[(i+1)%6])return true;p=p->next;}return false; } int main() {int n;//int key=0;還記得這天中午因為key的苦惱嗎2017.11.23 13:31bool ok=false;cin>>n;memset(hash,NULL,sizeof(hash));for(int i=0;i<n;++i){int key=0;for(int j=0;j<6;++j){scanf("%d",&a[j]);//用cin會超時key+=a[j];}key%=mod;if(find(key))ok=true;elseadd(key);}if(ok)printf("Twin snowflakes found.\n");elseprintf("No two snowflakes are alike.\n");return 0; }
總結
以上是生活随笔為你收集整理的poj 3349 雪花的全部內容,希望文章能夠幫你解決所遇到的問題。