[ACM] POJ 3349 Snowflake Snow Snowflakes(哈希查找,链式解决冲突)
Time Limit: 4000MS | Memory Limit: 65536K | |
Total Submissions: 30512 | Accepted: 8024 |
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
解题思路:
雪花有六个角。每一个角有一个长度。按顺时针或者逆时针给出,起点是随机的。两个雪花同样当且仅当每一个角的长度一样,且必须是连续的,比方 2 3 1 4 5 6 和 2 1 3 4 5 6就不行,1 2 3 4 5 6 4 3 2 1 6 5是一样的(第二个逆时针给出)。给出一堆雪花的六个角的长度。问这里面能不能找到两个同样的雪花。
1. 两个雪花同样的前提条件是,它们雪花六个角的长度和相等。
把每一个雪花依照长度映射到哈希表中。
这里哈希表用 vector< snowflake> hs[]. 当 hs[i].size()>1时,说明hs[i][j] 和hs[i][k]有可能是两个同样的雪花,仅仅要在hs[i]里面查找就能够了。
2. 怎么推断两个雪花a,b同样?分两步,一, 固定a,用b的每一个边和a的第一条边对齐,然后顺时针比較a,b的每一条边。二,固定a,用b的每一个边和a的第一条边对齐,然后逆时针比較a,b的每一条边。
Ps:以此题哀悼下考砸的数据结构。。
。。考试的时候我居然连拉链法解决冲突都不知道。。
代码:
#include <iostream>
#include <stdio.h>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=100002;
const int prime=99991; struct SnowFlake
{
int len[6];
}snow[maxn]; vector<SnowFlake>hs[prime]; void Hash(SnowFlake s)//映射
{
int addr=(s.len[0]+s.len[1]+s.len[2]+s.len[3]+s.len[4]+s.len[5])%prime;
hs[addr].push_back(s);
} bool cmp(SnowFlake a,SnowFlake b)//比較两个雪花是否同样
{
for(int i=0;i<6;i++)
{
if(a.len[0]==b.len[i]&&a.len[1]==b.len[(i+1)%6]&&a.len[2]==b.len[(i+2)%6]&&
a.len[3]==b.len[(i+3)%6]&&a.len[4]==b.len[(i+4)%6]&&a.len[5]==b.len[(i+5)%6])
return true;//固定a。顺时针比較
if(a.len[0]==b.len[i]&&a.len[1]==b.len[(i+5)%6]&&a.len[2]==b.len[(i+4)%6]&&
a.len[3]==b.len[(i+3)%6]&&a.len[4]==b.len[(i+2)%6]&&a.len[5]==b.len[(i+1)%6])
return true;//固定a, 逆时针比較
}
return false;
} int main()
{
int n;
scanf("%d",&n);
SnowFlake sf;
while(n--)
{
for(int i=0;i<6;i++)
scanf("%d",&sf.len[i]);
Hash(sf);
}
for(int i=0;i<prime;i++)
if(hs[i].size()>1)//有可能有同样的雪花
{
for(int j=0;j<hs[i].size();j++)
for(int k=j+1;k<hs[i].size();k++)
{
if(cmp(hs[i][j],hs[i][k]))
{
printf("Twin snowflakes found.");
return 0;
}
}
}
printf("No two snowflakes are alike.");
return 0;
}
[ACM] POJ 3349 Snowflake Snow Snowflakes(哈希查找,链式解决冲突)的更多相关文章
- 哈希—— 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: 30529 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 ...
- hash应用以及vector的使用简介:POJ 3349 Snowflake Snow Snowflakes
今天学的hash.说实话还没怎么搞懂,明天有时间把知识点总结写了,今天就小小的写个结题报告吧! 题意: 在n (n<100000)个雪花中判断是否存在两片完全相同的雪花,每片雪花有6个角,每个角 ...
- POJ 3349 Snowflake Snow Snowflakes(哈希)
http://poj.org/problem?id=3349 题意 :分别给你n片雪花的六个角的长度,让你比较一下这n个雪花有没有相同的. 思路:一开始以为把每一个雪花的六个角的长度sort一下,然后 ...
- POJ 3349 Snowflake Snow Snowflakes (哈希表)
题意:每片雪花有六瓣,给出n片雪花,六瓣花瓣的长度按顺时针或逆时针给出,判断其中有没有相同的雪花(六瓣花瓣的长度相同) 思路:如果直接遍历会超时,我试过.这里要用哈希表,哈希表的关键码key用六瓣花瓣 ...
- POJ 3349 Snowflake Snow Snowflakes(哈希表)
题意:判断有没有两朵相同的雪花.每朵雪花有六瓣,比较花瓣长度的方法看是否是一样的,如果对应的arms有相同的长度说明是一样的.给出n朵,只要有两朵是一样的就输出有Twin snowflakes fou ...
随机推荐
- activity 概念认知
工作流生命周期,5步 定义,工作流生命周期从流程定义开始. 发布,由开发人员打包各种资源,然后在系统管理中发布流程定义.包含流程定义文件.自定义表单.任务监听等. 执行,有具体的流程引擎如 activ ...
- mac与windows上部署使用Redis
windows下Redis安装 在Redis的官网下载页上有各种各样的版本,由于redis官网不支持windows,但是我们伟大的windows家族还是召唤了一群小伙伴开发了win版的redis.要在 ...
- Android: TODO 应用交互的两种实现方法(Behavior)
最近在写 TODO app,涉及到 Calendar 和 RecyclerView 的交互, 需求: 1. 往上滑动, Calendar 显示为周 2. 周显示模式下,往下滑动,显示为月 3. 列表下 ...
- 关于XILINX芯片IO管脚的上拉电阻的疑问
XILINX的每个IO脚都有一个可选的可配上拉电阻功能,现在我在配置文件的UCF里使用了这个上拉电阻:语法如下:NET"I_key_data" LOC = " ...
- 32个最热CPLD-FPGA论坛
1. OPENCORES.ORG这里提供非常多,非常好的PLD了内核,8051内核就可以在里面找到.进入后,选择project或者由http//www.opencores.org/browse.cgi ...
- 【Android】5.6 弹出菜单(PopUp Menus)
分类:C#.Android.VS2015: 创建日期:2016-02-07 一.简介 功能描述:用户单击按钮弹出菜单.当用户选择一个菜单项,会触发MenuItemClick事件并让弹出的菜单消失:如果 ...
- 【Android】3.16 离线地图功能
分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 一.简介 百度地图目前已经支持矢量离线地图数据的下载.更新. 使用离线地图,可满足在无网络环境下查看地图信息的 ...
- app 图标规格参考表
转自:http://www.cocoachina.com/appstore/top/2012/1105/5031.html 像我一样记不住iOS应用图标像素尺寸的开发者不在少数,我经常需要查询不同设备 ...
- 使用Apache JMeter压測Thrift
我这里以我的一篇帖子为样例 http://blog.csdn.net/mn960mn/article/details/50476759 这里已经有服务端了,先启动服务端 首先增加maven的依赖 &l ...
- 详解设计模式在Spring中的应用---转载
Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范.好了,话不多说,开始今天的内容. spring中常用的设计模式达到九种,我们一一举例: 第一种:简单工厂 又叫 ...