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.
");break;}
    }
    if(i==n)printf("No two snowflakes are alike.
");
    return 0;
}


原文地址:https://www.cnblogs.com/01world/p/5762851.html