题意:判断有没有两朵相同的雪花。每朵雪花有六瓣,比较花瓣长度的方法看是否是一样的,如果对应的arms有相同的长度说明是一样的。给出n朵,只要有两朵是一样的就输出有Twin snowflakes found.,如果任何两个都是不一样的输出No two snowflakes are alike。n=100,000。

思路:最简单的就是枚举每两片雪花,判断他们是否相同。时间复杂度为O(n*n),显然效果不理想。有没有更好的算法呢?hash:每读进一片雪花,将雪花hash,判断hash表里是否有相同的hash值,有相同的hash值,从链表中一一取出并判断是否同构,是同构得出结果。然后将该雪花加入到表中,所有雪花读完也没有发现相同的,则得出结果。

代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <vector>
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. const int MAX_SIZE = 100005; //最大的雪花数
  8. const int MOD_VAL = 90001; //hash函数,取余的数
  9.  
  10. int snow[MAX_SIZE][6]; //存储雪花信息
  11. vector<int> hash[MOD_VAL]; //hash表,表中存储的是snow数组的下标
  12.  
  13. /*判断雪花a与雪花b是否同样
  14. *输入:两个雪花在snow数组的下标
  15. *输出:true or false
  16. */
  17. bool isSame(int a, int b)
  18. {
  19. for(int i=0;i<6;i++)
  20. {
  21. if(/*顺时针方向*/
  22. (snow[a][0] == snow[b][i] &&
  23. snow[a][1] == snow[b][(i+1)%6] &&
  24. snow[a][2] == snow[b][(i+2)%6] &&
  25. snow[a][3] == snow[b][(i+3)%6] &&
  26. snow[a][4] == snow[b][(i+4)%6] &&
  27. snow[a][5] == snow[b][(i+5)%6])
  28.  
  29. ||
  30. /*逆时针方向*/
  31. (snow[a][0] == snow[b][i] &&
  32. snow[a][1] == snow[b][(i+5)%6] &&
  33. snow[a][2] == snow[b][(i+4)%6] &&
  34. snow[a][3] == snow[b][(i+3)%6] &&
  35. snow[a][4] == snow[b][(i+2)%6] &&
  36. snow[a][5] == snow[b][(i+1)%6])
  37. )
  38.  
  39. return true;
  40. }
  41.  
  42. return false;
  43. }
  44.  
  45. int main()
  46. {
  47. /*处理输入*/
  48. int n;
  49. int i,j;
  50. scanf("%d", &n);
  51. for( i = 0; i < n; i++)
  52. {
  53. for( j = 0; j < 6; j++)
  54. {
  55. scanf("%d", &snow[i][j]);
  56. }
  57. }
  58.  
  59. /*分别处理这n个雪花,判断有没两个雪花是相同的*/
  60. int sum, key;
  61. for(i = 0; i < n; i++)
  62. {
  63. /*求出雪花六个花瓣的和*/
  64. sum = 0;
  65. for( j = 0; j < 6; j++)
  66. {
  67. sum += snow[i][j];
  68. }
  69.  
  70. key = sum % MOD_VAL; //求出key
  71.  
  72. /*判断在hash表中hash[key]存储的雪花是否与雪花i相同*/
  73. for(vector<int>::size_type j = 0; j < hash[key].size(); j++)
  74. {
  75. /*若相同,则直接输出,并结束程序*/
  76. if(isSame(hash[key][j], i))
  77. {
  78. printf("%s/n", "Twin snowflakes found.");
  79. exit(0);
  80. }
  81. }
  82. /*若key相同的雪花没有一个与雪花i相同*/
  83. hash[key].push_back(i);
  84. }
  85.  
  86. /*若都不相同*/
  87. printf("%s/n", "No two snowflakes are alike.");
  88.  
  89. return 0;
  90. }

POJ 3349 Snowflake Snow Snowflakes(哈希表)的更多相关文章

  1. 哈希—— POJ 3349 Snowflake Snow Snowflakes

    相应POJ题目:点击打开链接 Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions ...

  2. POJ 3349 Snowflake Snow Snowflakes(简单哈希)

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

  3. poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)

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

  4. [ACM] POJ 3349 Snowflake Snow Snowflakes(哈希查找,链式解决冲突)

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

  5. POJ 3349 Snowflake Snow Snowflakes

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

  6. POJ 3349 Snowflake Snow Snowflakes (Hash)

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

  7. POJ 3349 Snowflake Snow Snowflakes (哈希表)

    题意:每片雪花有六瓣,给出n片雪花,六瓣花瓣的长度按顺时针或逆时针给出,判断其中有没有相同的雪花(六瓣花瓣的长度相同) 思路:如果直接遍历会超时,我试过.这里要用哈希表,哈希表的关键码key用六瓣花瓣 ...

  8. POJ - 3349 Snowflake Snow Snowflakes (哈希)

    题意:给定n(0 < n ≤ 100000)个雪花,每个雪花有6个花瓣(花瓣具有一定的长度),问是否存在两个相同的雪花.若两个雪花以某个花瓣为起点顺时针或逆时针各花瓣长度依次相同,则认为两花瓣相 ...

  9. poj3349 Snowflake Snow Snowflakes —— 哈希表

    题目链接:http://poj.org/problem?id=3349 题意:雪花有6个瓣,有n个雪花,输入每个雪花的瓣长,判断是否有一模一样的雪花(通过旋转或翻转最终一样,即瓣长对应相等).如果前面 ...

随机推荐

  1. Sqlserver------SQLServer2008R2中新增用户并设定表的访问权限

    在进行项目对接时,有时候处于系统安全性考虑,我们需要设置数据库的访问权限,这个时候,我们可以新增一个用户,然后设定用户的访问权限,具体步骤如下: 1,  新建登录对象 2,  点击用户映射 3,  操 ...

  2. EasyUI分页(前台分页和后台分页)

    整理一下以前的总结: 分页包括前台分页和后台分页两种,针对数据量比较小的,比如说单位,角色等,可以使用前台分页,而针对日志文件这些,需要后台分页. 先说说前台分页吧: function pagerFi ...

  3. RecyclerView 必知必会(转)

    [腾讯Bugly干货分享]RecyclerView 必知必会 本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com ...

  4. resin 4.0 项目的配置

    前一篇我们了解了resin中配置数据源,依照不同项目的要求我们进行数据源的配置,如多个项目共享多个数据源,一个项目配置多个数据源,以下我们来看看项目的部署方式: 1.在一个host(虚拟主机)下配置一 ...

  5. jQuery动态加载JS以减少服务器压力

    如果您要创建一个web2.0的应用程序,那么你的网页会包括大量的JavaScript文件,这些可能会拖慢您的网页.因此,动态加载JavaScript代码到您的网页是一个好主意,即只有当实用他们的时候加 ...

  6. 关于IIS上Yii2的Url路由美化

    Yii2默认的路由是酱紫的 http://.../admin/web/index.php?r=site/login 心中理想的美化Url应该这样  http://.../admin/web/site/ ...

  7. SpringMVC基于代码的配置方式(零配置,无web.xml)

    基于配置文件的web项目维护起来可能会更方便,可是有时候我们会有一些特殊的需求,比方防止客户胡乱更改配置,这时候我们须要给配置隐藏到代码中. 1.创建一个动态web项目(无需web.xml) 2.右键 ...

  8. 素数定理 nefu 117

    素数定理: 随着x的增长,P(x) ≍x/ln(x) ,P(x)表示(1,x)内的素数的个数. 这个定理,说明在1-x中,当x大到一定程度时,素数分布的概率为ln(x) 竟然还有一道题目. 素数个数的 ...

  9. ORACLE client 11g r2 客户端开发环境配置

    一.安装ORACLE客户端,这里不做说明.需要注意的是,客户端解压位置应该在磁盘根目录下. 如果放在带中文字或者空格的文件名的路径下出了问题,可以放到磁盘根目录在安装.应该就会没有问题. 另外,一般安 ...

  10. WCF基础之承载服务和生成客户端

    wcf的承载有三种iis.was和自承载,它们如何承载园子里有很多,就不多赘述. 自iis7以后iis支持http和非http的协议,使用iis承载服务与其他两种承载相比,我觉的最明显的是was和自承 ...