poj3349 Snowflake Snow Snowflakes(哈希表,散列表)

来源:互联网 发布:c语言大小写字母互换 编辑:程序博客网 时间:2024/05/29 12:05
原题链接:点击打开链接

题意:有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");elseprintf("No two snowflakes are alike.\n");return 0;}


0 0