poj3349 Snowflake Snow Snowflakes —— 哈希表
题目链接:http://poj.org/problem?id=3349
题意:雪花有6个瓣,有n个雪花,输入每个雪花的瓣长,判断是否有一模一样的雪花(通过旋转或翻转最终一样,即瓣长对应相等)。如果前面的雪花判断出有重复,则不需对后续的进行操作。
题解:直接将花瓣存在二维数组里面,然后每次新输入一个,再对之前的进行遍历判重。但是这种做法很低效,遍历花了很多时间。所以用哈希表,可直接访问是否存在重复,如果不重复,则用一维数组将雪花存起来(数组包含在结构体里),并将其“挂”在相应的哈希值(key)位置。而key值为6个瓣的总长。所以“挂”在同一key上的雪花有个共同的特点:总瓣长%MAX=key。 MAX为哈希值的个数。 整个哈希表由tab[MAX] 和 q[100010](结构体,记录雪花信息) 。
代码如下:
#include<cstdio>//poj3349
#include<cstring>
#define MAX 90001 struct node//记录花瓣信息,“挂在”tab[key]上
{
int a[12];
int next;//下一个雪花的地址
}q[100010]; int tab[MAX],cur;//tab[]记录相应key值得第一个雪花 int get(int *b)//获取key值
{
int sum = 0;
for(int i = 0; i<6; i++)
sum += b[i];
return sum%MAX;
} void insert(int key, int *b)//挂在tab[key]上,头插法
{
for(int i = 0; i<6; i++)
q[cur].a[i] = q[cur].a[i+6] = b[i]; q[cur].next = tab[key];
tab[key] = cur++;
} int search(int key,int *b)
{
int i,h = tab[key];
while(h!=-1)
{
for(int mov = 0; mov<6; mov++)//旋转的步数
{
for(i = 0; i<6; i++)//正面判断
if(q[h].a[i+mov]!=b[i]) break;
if(i==6) return 1; for(i = 0; i<6; i++)//反面判断,即翻转再正面判断
if(q[h].a[i+mov]!=b[5-i]) break;
if(i==6) return 1;
}
h = q[h].next;
}
insert(key,b);//如果没有重复,则插入
return 0;
} int main()
{
int n,b[6],key,flag = 0;
scanf("%d",&n);
cur = 0;
memset(tab,-1,sizeof(tab));
for(int i = 0; i<n; i++)
{
for(int j = 0; j<6; j++)
scanf("%d",&b[j]); if(flag) continue;
key = get(b);
if(search(key,b))
flag = 1;
}
if(flag)
puts("Twin snowflakes found.");
else
puts("No two snowflakes are alike.");
return 0;
}
poj3349 Snowflake Snow Snowflakes —— 哈希表的更多相关文章
- POJ3349 Snowflake Snow Snowflakes(哈希)
题目链接. 分析: 哈希竟然能这么用.检查两片雪花是否相同不难,但如果是直接暴力,定会超时.所以要求哈希值相同时再检查. AC代码: #include <iostream> #includ ...
- [poj3349]Snowflake Snow Snowflakes(hash)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 37615 Accepted: ...
- POJ--3349 Snowflake Snow Snowflakes(数字hash)
链接:Snowflake Snow Snowflakes 判断所有的雪花里面有没有相同的 每次把雪花每个角的值进行相加和相乘 之后hash #include<iostream> #incl ...
- poj3349 Snowflake Snow Snowflakes【HASH】
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 49991 Accep ...
- POJ3349 Snowflake Snow Snowflakes (hash
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 48624 Accep ...
- 【POJ3349 Snowflake Snow Snowflakes】【Hash表】
最近在对照省选知识点自己的技能树 今天是Hash 题面 大概是给定有n个6元序列 定义两个序列相等 当两个序列各自从某一个元素开始顺时针或者逆时针旋转排列能得到两个相同的序列 求这n个6元序列中是否有 ...
- POJ3349 Snowflake Snow Snowflakes 【哈希表】
题目 很简单,给一堆6元组,可以从任意位置开始往任意方向读,问有没有两个相同的6元组 题解 hash表入门题 先把一个六元组的积 + 和取模作为hash值,然后查表即可 期望\(O(n)\) #inc ...
- POJ3349: Snowflake Snow Snowflakes(hash 表)
考察hash表: 每一个雪花都有各自的6个arm值,如果两个雪花从相同或者不同位置开始顺时针数或者逆时针数可以匹配上,那么这两个雪花就是相等的. 我们采用hash的方法,这样每次查询用时为O(1),总 ...
- poj3349 Snowflake Snow Snowflakes
吼哇! 关于开散列哈希: 哈希就是把xxx对应到一个数字的东西,可以理解成一个map<xxx, int>(是不是比喻反了) 我们要设计一个函数,这个函数要确保同一个东西能得到相同的函数值( ...
随机推荐
- 洛谷—— P2117 小Z的矩阵
https://www.luogu.org/problemnew/show/2117 题目描述 小Z最近迷上了矩阵,他定义了一个对于一种特殊矩阵的特征函数G.对于N*N的矩阵A,A的所有元素均为0或1 ...
- [CQOI2018] 社交网络
题目背景 当今社会,在社交网络上看朋友的消息已经成为许多人生活的一部分.通常,一个用户在社交网络上发布一条消息(例如微博.状态.Tweet等) 后,他的好友们也可以看见这条消息,并可能转发.转发的消息 ...
- abp ueditor 多图以及文件无法上传
abp .net core使用ueditor遇到的问题:多图和上传文件无法上传,提示“http://请求错误”. 400 bad request解决办法: 因为abp默认启用了ValidateAnti ...
- 使用UltraISO为U盘或内存卡制作系统安装工具
此软件可以为U盘制作Windows安装版的启动工具,也可以为Linux制作启动工具,尤其是Ubuntu这些.提示:推荐购买一些读取速度快一些的U盘,运行起来可以节省很多时间. 如果是内存卡要实现此功能 ...
- 【bootstrap】使用支持bootstrap的时间插件daterangepicker
其中的架包和代码,具体可以去GitHub下查看: https://github.com/AngelSXD/myagenorderdiscount 1.引入js和css <link href=&q ...
- iOS开发 ----- 加载动画之牛顿摆的实现
牛顿摆动画 自己看动画有一段时间了,但是还是不是很能理解其中的一些属性方法之类的东西,琢磨了一下午写了一个牛顿摆的动画,这里记录一下,一遍以后查看先上图 先说下思路 说下牛顿摆的大致运动过程 根据牛顿 ...
- Dubbo简介及实例
节点角色说明: Ø Provider: 暴露服务的服务提供方. Ø Consumer: 调用远程服务的服务消费方. Ø Registry: 服务注册与发现的注册中心. Ø Monitor: 统 ...
- C#文件路径操作总结【转】
http://www.cnblogs.com/zhoufoxcn/archive/2006/10/24/2515874.html 一.获取当前文件的路径 1. System.Diagnostics ...
- C 标准库 - <setjmp.h>
C 标准库 - <setjmp.h> 简介 setjmp.h 头文件定义了宏 setjmp().函数 longjmp() 和变量类型 jmp_buf,该变量类型会绕过正常的函数调用和返回规 ...
- Solaris之单用户模式
1.TERM 表示终端 vt100 是简单的终端模式 export TERM=vt100 在此模式下,方向键无效,用字母键 有很多环境变量,PATH .PS1 .TERM 一般在屏幕上写的都是暂时的, ...