题意:
每个雪花都有六个分支,用六个整数代表,这六个整数是从任意一个分支开始,朝顺时针或逆时针方向遍历得到的。输入多个雪花,判断是否有形状一致的雪花存在。
分析:
简单的哈希,用取余法保存和相同的雪花,然后在判断雪花的各边即可。简单起见,用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;
}