题目链接: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 —— 哈希表的更多相关文章

  1. POJ3349 Snowflake Snow Snowflakes(哈希)

    题目链接. 分析: 哈希竟然能这么用.检查两片雪花是否相同不难,但如果是直接暴力,定会超时.所以要求哈希值相同时再检查. AC代码: #include <iostream> #includ ...

  2. [poj3349]Snowflake Snow Snowflakes(hash)

    Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 37615 Accepted: ...

  3. POJ--3349 Snowflake Snow Snowflakes(数字hash)

    链接:Snowflake Snow Snowflakes 判断所有的雪花里面有没有相同的 每次把雪花每个角的值进行相加和相乘 之后hash #include<iostream> #incl ...

  4. poj3349 Snowflake Snow Snowflakes【HASH】

    Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 49991   Accep ...

  5. POJ3349 Snowflake Snow Snowflakes (hash

    Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 48624   Accep ...

  6. 【POJ3349 Snowflake Snow Snowflakes】【Hash表】

    最近在对照省选知识点自己的技能树 今天是Hash 题面 大概是给定有n个6元序列 定义两个序列相等 当两个序列各自从某一个元素开始顺时针或者逆时针旋转排列能得到两个相同的序列 求这n个6元序列中是否有 ...

  7. POJ3349 Snowflake Snow Snowflakes 【哈希表】

    题目 很简单,给一堆6元组,可以从任意位置开始往任意方向读,问有没有两个相同的6元组 题解 hash表入门题 先把一个六元组的积 + 和取模作为hash值,然后查表即可 期望\(O(n)\) #inc ...

  8. POJ3349: Snowflake Snow Snowflakes(hash 表)

    考察hash表: 每一个雪花都有各自的6个arm值,如果两个雪花从相同或者不同位置开始顺时针数或者逆时针数可以匹配上,那么这两个雪花就是相等的. 我们采用hash的方法,这样每次查询用时为O(1),总 ...

  9. poj3349 Snowflake Snow Snowflakes

    吼哇! 关于开散列哈希: 哈希就是把xxx对应到一个数字的东西,可以理解成一个map<xxx, int>(是不是比喻反了) 我们要设计一个函数,这个函数要确保同一个东西能得到相同的函数值( ...

随机推荐

  1. Xamarin.Forms特殊的视图BoxView

    Xamarin.Forms特殊的视图BoxView   BoxView是Xamarin.Forms比较特殊的视图.该视图构建非常简单,其作用也很单一.它的作用就是构成一个特定颜色的色块.在界面设计中, ...

  2. Ampzz 2011 Cross Spider 计算几何

    原题链接:http://codeforces.com/gym/100523/attachments/download/2798/20142015-ct-s02e07-codeforces-traini ...

  3. SpringBoot系列之(一)helloworld!

    要说什么最流行,现阶段肯定是Springboot和Springcloud,在Spring官方网站上第一个就是springboot,可见对springboot的重视程度.主要原因springboot集成 ...

  4. springBoot报错Exception in thread "main" java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level

    解决办法: 如果使用的是阿里云 maven 镜像,在这会有找不到最新 Springboot 相关包的问题,请把加速镜像指向华为云: <mirror> <id>huaweiclo ...

  5. IntelliJ IDEA ,springboot 2.0 +mybatis 创建和访问数据库

    环境: JDK8+windows10 步骤 New Module —>Spring Initializr—>next 1 ​ 2. ​ 3.web勾选web,sql里面可以不勾,后续添加, ...

  6. 补充==的使用和equals的区别

    字节码的比较     Class 相等与否使用“==” 进行比较,形如 if (adapter == IContentOutlinePage.class)  进行比较,因为字节码在JVM中只有一份,地 ...

  7. 【hibernate postgresql】注解@TypeDef/@Enumerated/数据库字段gender为枚举类型,从前台接受到实体后进行保存报错:org.postgresql.util.PSQLException: ERROR: column "gender" is of type gender but expression is of type character varying

    数据库字段gender为枚举类型,从前台接受到实体后进行保存报错:org.postgresql.util.PSQLException: ERROR: column "gender" ...

  8. ES6新语法学习

    参考: 1.http://es6.ruanyifeng.com/#docs/let#let-命令 2.https://reactjs.org/tutorial/tutorial.html 3.http ...

  9. 使用hexo搭建github个人博客网站

    搭建步骤: 1>Mac或win电脑一台,本文以mac为例. 2>下载安装Git和Node 3>安装hexo 4>注册登录GitHub,创建一个仓库,库名格式为:GitHub用户 ...

  10. libsvm交叉验证与网格搜索(参数选择)

    首先说交叉验证.交叉验证(Cross validation)是一种评估统计分析.机器学习算法对独立于训练数据的数据集的泛化能力(generalize), 能够避免过拟合问题.交叉验证一般要尽量满足:1 ...