题目链接:http://poj.org/problem?id=3349

题意:雪花有6个瓣,有n个雪花,输入每个雪花的瓣长,判断是否有一模一样的雪花(通过旋转或翻转最终一样,即瓣长对应相等)。如果前面的雪花判断出有重复,则不需对后续的进行操作。

题解:直接将花瓣存在二维数组里面,然后每次新输入一个,再对之前的进行遍历判重。但是这种做法很低效,遍历花了很多时间。所以用哈希表,可直接访问是否存在重复,如果不重复,则用一维数组将雪花存起来(数组包含在结构体里),并将其“挂”在相应的哈希值(key)位置。而key值为6个瓣的总长。所以“挂”在同一key上的雪花有个共同的特点:总瓣长%MAX=key。 MAX为哈希值的个数。 整个哈希表由tab[MAX] 和 q[100010](结构体,记录雪花信息) 。

代码如下:

  1. #include<cstdio>//poj3349
  2. #include<cstring>
  3. #define MAX 90001
  4.  
  5. struct node//记录花瓣信息,“挂在”tab[key]上
  6. {
  7. int a[12];
  8. int next;//下一个雪花的地址
  9. }q[100010];
  10.  
  11. int tab[MAX],cur;//tab[]记录相应key值得第一个雪花
  12.  
  13. int get(int *b)//获取key值
  14. {
  15. int sum = 0;
  16. for(int i = 0; i<6; i++)
  17. sum += b[i];
  18. return sum%MAX;
  19. }
  20.  
  21. void insert(int key, int *b)//挂在tab[key]上,头插法
  22. {
  23. for(int i = 0; i<6; i++)
  24. q[cur].a[i] = q[cur].a[i+6] = b[i];
  25.  
  26. q[cur].next = tab[key];
  27. tab[key] = cur++;
  28. }
  29.  
  30. int search(int key,int *b)
  31. {
  32. int i,h = tab[key];
  33. while(h!=-1)
  34. {
  35. for(int mov = 0; mov<6; mov++)//旋转的步数
  36. {
  37. for(i = 0; i<6; i++)//正面判断
  38. if(q[h].a[i+mov]!=b[i]) break;
  39. if(i==6) return 1;
  40.  
  41. for(i = 0; i<6; i++)//反面判断,即翻转再正面判断
  42. if(q[h].a[i+mov]!=b[5-i]) break;
  43. if(i==6) return 1;
  44. }
  45. h = q[h].next;
  46. }
  47. insert(key,b);//如果没有重复,则插入
  48. return 0;
  49. }
  50.  
  51. int main()
  52. {
  53. int n,b[6],key,flag = 0;
  54. scanf("%d",&n);
  55. cur = 0;
  56. memset(tab,-1,sizeof(tab));
  57. for(int i = 0; i<n; i++)
  58. {
  59. for(int j = 0; j<6; j++)
  60. scanf("%d",&b[j]);
  61.  
  62. if(flag) continue;
  63. key = get(b);
  64. if(search(key,b))
  65. flag = 1;
  66. }
  67. if(flag)
  68. puts("Twin snowflakes found.");
  69. else
  70. puts("No two snowflakes are alike.");
  71. return 0;
  72. }

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. 基于sklearn的分类器实战

    已迁移到我新博客,阅读体验更佳基于sklearn的分类器实战 完整代码实现见github:click me 一.实验说明 1.1 任务描述 1.2 数据说明 一共有十个数据集,数据集中的数据属性有全部 ...

  2. jenkins按版本发布maven项目

    1.先为java这个项目创建三个版本 vim pom.xml vim src/main/java/com/ghz/testweb/App.java git add . git commit -m &q ...

  3. luogu P1140 相似基因

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了4种核苷酸,简记作A,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类基因工作组的任务中,生物学家研究 ...

  4. poj 2104 K-th Number(主席树

    Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 59058   Accepted: 20529 Case Time Limi ...

  5. 【js】前台调试,在浏览器调试环境下找不到js怎么办?

    针对这次 整个项目单页面的情况下,所有点击出现的新页面都是追加在母页面的情况下,很多时候不像原本的情况,可以直接在浏览器的调试环境下找到想要调试的js代码 这种情况下,怎么能找到子页面的js代码,调试 ...

  6. 【jQuery】方法和选择器的双重使用详解

    1.jQuery选择直接子节点+除了某个元素 1>方法 $(".begon").children(".row:not(.moreDetail)") 2&g ...

  7. eclipse下的ssh框架整合过程及測试

    最近在搭建Stuts2+hibernate+spring的框架,网上看的教程,大部分都是非常easy的步骤.没有比較具体的步骤以及每一个步骤完毕之后怎样检查是否配置成功.下面是笔者依据自己搭建的过程进 ...

  8. pyquery库的使用

    pyquery标签选择 获取了所有的img标签(css选择器,你也可以换成不同的class和id) import requests import re from pyquery import PyQu ...

  9. 微信小程序日期定位弹出框遮挡问题

    只需要用bindtap绑定一个点击后的操作(隐藏键盘): wx.hideKeyboard()

  10. Android 扫描Scard卡全部的图片

    这几天为了扫描Scard卡全部的图片的事非常纠结,我原本以为这是一件非常easy的事.可是我发现我错了.网上也没有完整的代码.仅仅是零零碎碎的能扫描单个文件的代码.在今天代码调试通过之后,我认为我有必 ...