poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)
| Time Limit: 4000MS | Memory Limit: 65536K | |
| Total Submissions: 30529 | Accepted: 8033 |
Description
You may have heard that no two snowflakes are alike. Your task is to write a program to determine whether this is really true. Your program will read information about a collection of snowflakes, and search for a pair that may be identical. Each snowflake has six arms. For each snowflake, your program will be provided with a measurement of the length of each of the six arms. Any pair of snowflakes which have the same lengths of corresponding arms should be flagged by your program as possibly identical.
Input
The first line of input will contain a single integer n, 0 < n ≤ 100000, the number of snowflakes to follow. This will be followed by n lines, each describing a snowflake. Each snowflake will be described by a line containing six integers (each integer is at least 0 and less than 10000000), the lengths of the arms of the snow ake. The lengths of the arms will be given in order around the snowflake (either clockwise or counterclockwise), but they may begin with any of the six arms. For example, the same snowflake could be described as 1 2 3 4 5 6 or 4 3 2 1 6 5.
Output
If all of the snowflakes are distinct, your program should print the message:
No two snowflakes are alike.
If there is a pair of possibly identical snow akes, your program should print the message:
Twin snowflakes found.
Sample Input
2
1 2 3 4 5 6
4 3 2 1 6 5
Sample Output
Twin snowflakes found.
Source
#include <iostream>
#include <stdio.h> using namespace std; #define MAXPRIME 100001 struct Hashnode{
int len[];
Hashnode* next;
};
Hashnode hashtable[MAXPRIME]={}; //哈希表,拉链法解决哈希冲突 int getkey(Hashnode* p) //哈希函数,求和取余法。求一片雪花对应的key值
{
int i,key=;
for(i=;i<;i++)
key = (key + p->len[i])%MAXPRIME;
return key;
} bool clockwise(Hashnode* p,Hashnode* q) //顺时针看有没有相同的顺序
{
int i,j;
for(i=;i<;i++){
for(j=;j<;j++)
if(p->len[j]!=q->len[(i+j)%])
break;
if(j>=)
break;
}
//找到两片相同的雪花
if(i<)
return true;
else
return false;
} bool counterclockwise(Hashnode* p,Hashnode* q) //逆时针看有没有相同的顺序
{
int i,j;
for(i=;i<;i++){
for(j=;j<;j++)
if(p->len[j]!=q->len[(i+-j)%])
break;
if(j>=)
break;
}
//找到两片相同的雪花
if(i<)
return true;
else
return false;
} bool iscom(Hashnode* p) //判断这片雪花是否和之前的有一片雪花完全相同
{
int key = getkey(p);
if(hashtable[key].next==NULL){ //没有冲突
hashtable[key].next = p;
return false;
}
else{ //产生冲突
//拉链法解决冲突
Hashnode* q = &hashtable[key];
p->next = q->next;
q->next = p; q = p->next; //从p的下一个开始比较
while(q){
if(clockwise(p,q) || counterclockwise(p,q)) //顺时针或者逆时针看有一个方向有相同的顺序,说明找到了相同的雪花
return true;
q = q->next;
}
return false;
}
} int main()
{
int n,i;
bool f = false; //找没找到两片相同的雪花,默认是没有
scanf("%d",&n);
while(n--){
Hashnode* p = new Hashnode;
p->next = NULL;
for(i=;i<;i++) //读取这片雪花的6个花瓣的长度
scanf("%d",&p->len[i]);
if(iscom(p)){ //判断这片雪花是否和之前的有一片雪花相同,如果有,改变f的值。
//函数中顺便将这片花瓣的信息插入到哈希表。
f=true;
break; //没有输入完毕,中途退出也可以,省了300MS
}
}
//判断有没有找到两片一样的雪花
if(f)
printf("Twin snowflakes found.\n");
else
printf("No two snowflakes are alike.\n");
return ;
}
Freecode : www.cnblogs.com/yym2013
poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)的更多相关文章
- [ACM] POJ 3349 Snowflake Snow Snowflakes(哈希查找,链式解决冲突)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 30512 Accep ...
- 哈希—— POJ 3349 Snowflake Snow Snowflakes
相应POJ题目:点击打开链接 Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions ...
- POJ 3349 Snowflake Snow Snowflakes(简单哈希)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 39324 Accep ...
- POJ 3349 Snowflake Snow Snowflakes
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 27598 Accepted: ...
- POJ 3349 Snowflake Snow Snowflakes (Hash)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 48646 Accep ...
- POJ 3349 Snowflake Snow Snowflakes (哈希表)
题意:每片雪花有六瓣,给出n片雪花,六瓣花瓣的长度按顺时针或逆时针给出,判断其中有没有相同的雪花(六瓣花瓣的长度相同) 思路:如果直接遍历会超时,我试过.这里要用哈希表,哈希表的关键码key用六瓣花瓣 ...
- POJ 3349 Snowflake Snow Snowflakes(哈希表)
题意:判断有没有两朵相同的雪花.每朵雪花有六瓣,比较花瓣长度的方法看是否是一样的,如果对应的arms有相同的长度说明是一样的.给出n朵,只要有两朵是一样的就输出有Twin snowflakes fou ...
- POJ - 3349 Snowflake Snow Snowflakes (哈希)
题意:给定n(0 < n ≤ 100000)个雪花,每个雪花有6个花瓣(花瓣具有一定的长度),问是否存在两个相同的雪花.若两个雪花以某个花瓣为起点顺时针或逆时针各花瓣长度依次相同,则认为两花瓣相 ...
- POJ 3349 Snowflake Snow Snowflakes(哈希)
http://poj.org/problem?id=3349 题意 :分别给你n片雪花的六个角的长度,让你比较一下这n个雪花有没有相同的. 思路:一开始以为把每一个雪花的六个角的长度sort一下,然后 ...
随机推荐
- nginx 下 bootstrap fa 字体异常问题
server { listen 8082; # server_name 192.168.16.88; # root /home/ywt/workspace/kuF/web/statics; # aut ...
- XsltListViewWebPart 和自定义列表视图
http://msdn.microsoft.com/zh-cn/library/ff806162(v=office.14).aspx
- jquery checkbox 限制多选的个数
2015年11月6日 16:32:49 选中第四个的时候提示超过了3个, 点解alert框取消后, 将最后一个选中的checkbox取消选中 <script> $(document).re ...
- 23. javacript高级程序设计-数据存储
1. 数据存储 1.1 cookie HTTP Cookie, cookie,最初用来在客户端存储回话信息. (1). 限制,不同浏览器对特定域名下的cookie 的个数有限制,每个域名下最好不要操过 ...
- bootstrap 重写JS的alert、comfirm函数
原理是使用bootstrap的Modal插件实现. 一.在前端模板合适的地方,加入Modal展现div元素. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...
- Match:Cyclic Nacklace(KMP的next数组的高级应用)(HDU 3746)
串珠子 题目大意:给定一个字串,要你找到如果要使之成为循环串,在末尾需要的最小的字数(只能添加字符,不能删减字符) 首先联动一下之前做过的动态规划问题POJ 3280,当然了3280这一题是用的LD, ...
- Mathematics:Semi-prime H-numbers(POJ 3292)
Semi-prime H-numbers 题目大意,令4n+1的数叫H数,H数素数x的定义是只能被x=1*h(h是H数),其他都叫合数,特别的,当一个数只能被两个H素数乘积得到时,叫H-semi数 ...
- 【gsl】生成随机数
来自:http://hsxqwanting.blog.163.com/blog/static/16945437201301042830815/ 使用GSL生成随机数时的三个步骤: (1)gsl_ ...
- 【网络】ssl与ssh
ssh(安全外壳协议):百度百科 ssl(安全套接字):http://kb.cnblogs.com/page/162080/ https应用了ssl协议 ssh与ssl的区别:http://blog. ...
- noip2016复习
明天的复习任务 矩阵乘法 优先队列(老忘记怎么打) 二分图 K短路 单调队列(还是不太明白各种顺序) 扩展欧几里得 费马小定理求素数 哎呀,列了这么多,任重而道远啊-- 今夕是何夕,晚风过花庭-- 故 ...