原题链接:
点击打开链接
题意:有n片雪花, 雪花都是六棱的,如果六棱的长度对应完全相等(正序或反序),则认为两片雪花相同。
//哈希表
#include <stdio.h>
#include <string.h>
const int MOD = 12497;
const int MAX_H = MOD + 1;
const int MAX_L = 20;
struct SNOW {
int a[6];
};
SNOW hash_snow[MAX_N][MAX_L]; //哈希表其中的关键字是按6片雪花的和对MOD取余,hash_snow[i][j]表示i关键子有j片雪花
int vis[MAX_N]; //标记雪花的个数
int hash(SNOW sn){
int i, sum = 0;
for(i = 0;i < 6;i ++){
sum += sn.a[i];
}
return sum % MOD;
}
bool judge(SNOW s1, SNOW s2){
int i, j, k;
for(i = 0;i < 6;i ++){ //正向判断
for(j = i, k = 0;k < 6;j = (j + 1) % 6, k ++){
if(s1.a[j] != s2.a[k]) break;
}
if(k == 6) return true;
}
for(i = 0;i < 6;i ++){ //反向判断
for(j = i, k = 0;k < 6;j = (j + 6 - 1) % 6, k ++){
if(s1.a[j] != s2.a[k]) break;
}
if(k == 6) return true;
}
return false;
}
int main(){
int n, flag = 0;
SNOW snow;
scanf("%d", &n);
while(n --){
int i, x, dex;
for(i = 0;i < 6;i ++){
scanf("%d", &snow.a[i]);
}
if(flag) continue;
dex = hash(snow);//关键字
for(i = 0;i < vis[dex];i ++){
if(judge(snow, hash_snow[dex][i])){
flag = 1; //标记已经找到了相同的
break;
}
}
hash_snow[dex][vis[dex]] = snow;
vis[dex] ++;
}
if(flag)
printf("Twin snowflakes found.\n");
else
printf("No two snowflakes are alike.\n");
return 0;
}