标签:return int 雪花 ++ flag hash mod
hash表
Snowflake Snow Snowflakes
有n片雪花,每片雪花有六个角,六个角的角度从顺时针依次记为\(a_1,a_2....a_6\) 判断两片雪花是否相同的依据是 从任何一个角开始顺时针或者逆时针往后记录角度,得到的六元组相等的话,就代表雪花相同,例如\(a_1, a_2...a_6\) 和 \(a_2,a_3...a_1\) 相等的话,两片雪花相同。\(a_1,a_2...a_6\) 和\(a_6,a_5...a_1\) 相等的话,两片雪花相同。
题解:
定义hash函数,H(\(a_1,a_2...a_6\)) = (\(\sum_{i = 1}^{6} a_i + \prod_{i =1}^{6} a_i\)) % mod;(其中mod是我们定义的质数)
建立一个hash表,把n片雪花依次插入,对于每片雪花,我们直接扫描表头H对应的链表,检查是否存在相同的雪花即可。
具体看代码,还是比较简单易懂的
#include <cstdio>
int head[100010], snow[100010][10], next[100010], mod = 99991, cnt;
bool equaln(int *a, int *b) {
for(int i = 0; i < 6; i++) {
int flag = 0;
for(int j = 0; j < 6; j++) {
if(a[(i+j) % 6] != b[j]) {
flag = 1;
break;
}
}
if(!flag) return true;
flag = 0;
for(int j = 5; j >= 0; j--) {
if(a[(i+j) % 6] != b[5-j]) {
flag = 1;
break;
}
}
if(!flag) return true;
}
return false;
}
bool insertn(int *a) {
long long sum = 0, mul = 1, val = 0;
for(int i = 0; i < 6; i++) {
sum = (sum + a[i]) % mod;
mul = (mul * a[i]) % mod;
}
val = (sum + mul) % mod;
for(int i = head[val]; i; i = next[i]) {
if(equaln(snow[i], a)) return true;
}
cnt++;
for(int i = 0; i < 6; i++) {
snow[cnt][i] = a[i];
}
next[cnt] = head[val];
head[val] = cnt;
return false;
}
int main() {
int n, f = 0;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
int a[10];
for(int j = 0; j < 6; j++) {
scanf("%d", &a[j]);
}
if(insertn(a)) {
f = 1;
}
}
if(f == 1) printf("Twin snowflakes found.\n");
else printf("No two snowflakes are alike.\n");
return 0;
}
标签:return,int,雪花,++,flag,hash,mod 来源: https://www.cnblogs.com/fanshhh/p/12733467.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。