POJ 3349 Snowflake Snow Snowflaks <数的哈希>

来源:互联网 发布:ubuntu 怎么卸载qq 编辑:程序博客网 时间:2024/06/05 07:05

题目:传送门。


分析:简单哈希题,直接上代码吧。


代码:

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;const int mod=999983;class HashTable{public:HashTable():next(0) {}HashTable *next;int leaf[6];};HashTable *hash[mod];int len[6];bool clockwise(HashTable *h){for(int i=0;i<6;++i){int j;for(j=0;j<6;++j){if(h->leaf[j]!=len[(j+i)%6]) break;}if(j==6) return true;}return false;}bool antiClockwise(HashTable *h){for(int i=0;i<6;++i){int j;for(j=0;j<6;++j){if(h->leaf[j]!=len[(5-j-i+6)%6]) break;}if(j==6) return true;}return false;}bool judge(HashTable *h){if(clockwise(h)||antiClockwise(h)) return true;HashTable *temp=h->next;while(temp){if(clockwise(temp)||antiClockwise(temp)) return true;temp=temp->next;}HashTable *now=new HashTable;for(int i=0;i<6;++i){now->leaf[i]=len[i];}now->next=h->next;h->next=now;return false;}int main(){//ios::sync_with_stdio(false);int n;cin>>n;bool flag=false;memset(hash,0,sizeof hash);while(n--){int key=0;for(int i=0;i<6;++i){scanf("%d",&len[i]);key+=len[i];}key%=mod;if(!hash[key]){HashTable *temp=new HashTable;for(int i=0;i<6;++i){temp->leaf[i]=len[i];}hash[key]=temp;}else{if(flag) continue;flag=judge(hash[key]);}}if(flag) cout<<"Twin snowflakes found.\n";else cout<<"No two snowflakes are alike.\n";return 0;}


0 0
原创粉丝点击