poj 3349 简单hash
题意:
每个雪花都有六个分支,用六个整数代表,这六个整数是从任意一个分支开始,朝顺时针或逆时针方向遍历得到的。输入多个雪花,判断是否有形状一致的雪花存在。
分析:
简单的哈希,用取余法保存和相同的雪花,然后在判断雪花的各边即可。简单起见,用vector保存。链表麻烦点。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<vector> #include<string> using namespace std; const int mod=100007; const int N=100000+9; typedef struct node { int a[6]; }; vector<node>s[N]; bool cmp(node& p,node& q) { int i,j; for(i=0;i<6;i++){ for(j=0;j<6;j++)if(p.a[j]!=q.a[(i+j)%6])break; if(j==6)return true; } for(i=0;i<6;i++){ for(j=0;j<6;j++)if(p.a[j]!=q.a[(i-j+6)%6])break; if(j==6)return true; } return false; } bool check(int id,node& cur) { for(int i=0;i<s[id].size();i++){ if(cmp(s[id][i],cur))return true; } s[id].push_back(cur);return false; } int main() { //freopen("f.txt","r",stdin); int n,i; scanf("%d",&n); node p; for(i=0;i<n;i++){ int t=0; for(int j=0;j<6;j++)scanf("%d",&p.a[j]),t+=p.a[j]; t%=mod; if(check(t,p)){printf("Twin snowflakes found.\n");break;} } if(i==n)printf("No two snowflakes are alike.\n"); return 0; }