题意:每个雪花都有六个角,给出n个雪花的六个角的长度,问其中有没有相同的两片雪花。若有则输出:Twin snowflakes found. 否则输出:No two snowflakes are alike.
题解:简单哈希。将每个雪花的六个角的长度加起来,存在一个vector里,判断有相同长度和的两片雪花是否相同。注意,这里逆反两个方向都要判断。
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
const int MOD=199999;//不能取的太大,否则运算慢会超时
vector<int>vec[MOD];
int arm[100005][6];
bool isSame(int st1,int st2){
bool flag;
for(int i=0;i<6;i++){//clockwise
flag=true;
for(int j=i,k=0;k<6;k++,j=(j+1)%6){
if(arm[st1][k]!=arm[st2][j]){
flag=false;
break;
}
}
if(flag) return true;
}
for(int i=0;i<6;i++){//counterclockwise
flag=true;
for(int j=i,k=0;k<6;k++){
if(arm[st1][k]!=arm[st2][j]){
flag=false;
break;
}
if((--j)<0) j=5;
}
if(flag) return true;
}
return flag;
}
int main()
{
int n,sum;
bool flag;
while(scanf("%d",&n)!=EOF){
flag=false;
for(int i=1;i<=n;i++){
sum=0;
for(int j=0;j<6;j++){
scanf("%d",&arm[i][j]);
if(flag) continue;
sum+=arm[i][j];
}
if(flag) continue;
sum%=MOD;
for(int j=0;j<vec[sum].size();j++){
if(isSame(vec[sum][j],i)){
flag=true;
break;
}
}
vec[sum].push_back(i);
}
if(flag) puts("Twin snowflakes found.");
else puts("No two snowflakes are alike.");
}
return 0;
}