- 浏览: 197070 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (137)
- c++ (74)
- c++,算法,回溯 (2)
- DP问题。 (9)
- DP问题,0/1背包问题 (3)
- 数学问题 (6)
- 贪心算法 (10)
- 排序 (16)
- 数据结构 (7)
- 容器 (2)
- 模拟问题 (2)
- 水题 (8)
- 并查集 (3)
- 非技术 (2)
- 素数问题 (1)
- DFS (3)
- 二叉树 (1)
- 递归 (1)
- 图论 (5)
- 最小生成树 (5)
- 最短路径 (6)
- bell_flaod算法 (2)
- hash (3)
- 二分查找 (1)
- 搜索 (5)
- BFS (5)
- STL (3)
- 字符串hash (1)
- 拓扑排序 (1)
- 字典树 (4)
- 哈弗曼树 (1)
- KMP (7)
- 线段树 (9)
- 树状数组 (6)
- 全排列 (2)
- DP问题 (2)
- LCS (1)
- 最长不下降子序列 (2)
- 面试经验 (3)
题意:判断有没有两朵相同的雪花。每朵雪花有六瓣,比较花瓣长度的方法看是否是一样的,如果对应的arms有相同的长度说明是一样的。给出n朵,只要有两朵是一样的就输出有Twin snowflakes found.,如果任何两个都是不一样的输出No two snowflakes are alike。n=100,000。
思路:最简单的就是枚举每两片雪花,判断他们是否相同。时间复杂度为O(n*n),显然效果不理想。有没有更好的算法呢?hash:每读进一片雪花,将雪花hash,判断hash表里是否有相同的hash值,有相同的hash值,从链表中一一取出并判断是否同构,是同构得出结果。然后将该雪花加入到表中,所有雪花读完也没有发现相同的,则得出结果。
代码如下:
#include <stdio.h> #include <stdlib.h> #include <vector> #include <iostream> using namespace std; const int MAX_SIZE = 100005; //最大的雪花数 const int MOD_VAL = 90001; //hash函数,取余的数 int snow[MAX_SIZE][6]; //存储雪花信息 vector<int> hash[MOD_VAL]; //hash表,表中存储的是snow数组的下标 /*判断雪花a与雪花b是否同样 *输入:两个雪花在snow数组的下标 *输出:true or false */ bool isSame(int a, int b) { for(int i=0;i<6;i++) { if(/*顺时针方向*/ (snow[a][0] == snow[b][i] && snow[a][1] == snow[b][(i+1)%6] && snow[a][2] == snow[b][(i+2)%6] && snow[a][3] == snow[b][(i+3)%6] && snow[a][4] == snow[b][(i+4)%6] && snow[a][5] == snow[b][(i+5)%6]) || /*逆时针方向*/ (snow[a][0] == snow[b][i] && snow[a][1] == snow[b][(i+5)%6] && snow[a][2] == snow[b][(i+4)%6] && snow[a][3] == snow[b][(i+3)%6] && snow[a][4] == snow[b][(i+2)%6] && snow[a][5] == snow[b][(i+1)%6]) ) return true; } return false; } int main() { /*处理输入*/ int n; int i,j; scanf("%d", &n); for( i = 0; i < n; i++) { for( j = 0; j < 6; j++) { scanf("%d", &snow[i][j]); } } /*分别处理这n个雪花,判断有没两个雪花是相同的*/ int sum, key; for(i = 0; i < n; i++) { /*求出雪花六个花瓣的和*/ sum = 0; for( j = 0; j < 6; j++) { sum += snow[i][j]; } key = sum % MOD_VAL; //求出key /*判断在hash表中hash[key]存储的雪花是否与雪花i相同*/ for(vector<int>::size_type j = 0; j < hash[key].size(); j++) { /*若相同,则直接输出,并结束程序*/ if(isSame(hash[key][j], i)) { printf("%s/n", "Twin snowflakes found."); exit(0); } } /*若key相同的雪花没有一个与雪花i相同*/ hash[key].push_back(i); } /*若都不相同*/ printf("%s/n", "No two snowflakes are alike."); return 0; }
关于hash表的题目未完待续……
发表评论
-
虚函数、纯虚函数、虚基类、抽象类、虚函数继承、虚继承
2013-08-29 14:34 790虚函数:虚函数是C++中用于实现多态(polymorphis ... -
排序算法总结
2013-05-17 11:00 790选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法, ... -
poj 3122
2012-12-11 19:51 814题意:作者要开一个生日party,他现在拥有n块高度都为1 ... -
poj 3273
2012-12-11 16:49 950题意:给你天数n,和每天需要花的钱,让你把这些天分成m份(每份 ... -
字典树学习材料
2012-05-30 14:29 938字典树,又称单词查找树,Trie树,是一种树形结构,典型应 ... -
poj 1159
2012-05-28 19:08 1401题目大意:给你一段字符串,让你求出在中间最少加入几个字符 ... -
poj 3176
2012-05-28 14:47 978大致题意: 输入一个n层的三角形,第i层有i个数,求从第 ... -
poj 1260
2012-05-28 09:54 1574题意解释: 有n个等级的珠宝,等级依次升高,等级越高价钱越高 ... -
poj 1836
2012-05-28 09:22 2674是POJ2533的扩展题。题意不难,令到原队列 ... -
poj 2533
2012-05-26 15:36 1209在做这道题目之前,首先让我们了解一下什么是LIS算法,LIS俗 ... -
poj 3267
2012-05-26 09:43 777从程序可以看出,第i个位置到L所删除的字符数,总是先取最坏情况 ... -
poj 1276
2012-05-25 16:20 2355题意: 这道题的意思是给你一堆钱,各种面值的都有,比 ... -
poj 1094
2012-05-25 13:54 1065题意:给出字母个数,和有限个有序对(a<b)求出能确定字 ... -
poj 3393
2012-05-23 17:00 1228大致题意: 科普文一篇,文章80%都是无用信息,因为 ... -
poj 3007
2012-05-14 10:21 952大致题意: 给定一个字符串,从任意位置把它切为两半, ... -
poj 3096
2012-05-10 21:09 969题意: 定义D-pairs表示取字符串s中相距为D的两个字母 ... -
poj 1426
2012-04-26 20:11 2120大致题意: 给出一个整数n,(1 <= n <= ... -
poj 1797
2012-04-24 15:05 1592题目大意是就是何处一个图,n个顶点和m条边,每个边都有最大承载 ... -
poj 1338
2012-04-23 10:20 1227题意:题目意思是求由2,3,5的乘积组成的数从大到小排列,从1 ... -
poj 2021
2012-04-19 15:00 897题意:Ted今年100岁,给出n对他家族的关系:“父 ...
相关推荐
北大POJ3349-Snowflake Snow Snowflakes 解题报告+AC代码
poj 3349 Snowflake Snow Snowflakes.md
POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
POJ第1861题源码 POJ第1861题源码 POJ第1861题源码
poj分类poj分类poj分类poj分类
北大POJ1159-Palindrome 解题报告+AC代码
poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告
poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告
C语言 poj npu 西工大 C语言Poj答案全完整打包,给有需要的朋友
poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告
poj 1659解题报告poj 1659解题报告poj 1659解题报告poj 1659解题报告
POJ1503解答 POJ1503解答,正确答案(已通过POJ)
POJ1048,加强版的约瑟夫问题 难度中等
北大POJ2002-Squares 解题报告+AC代码
POJ1083的代码,POJ1083的代码,POJ1083的代码
poj 百练 题目分类 poj 百练 题目分类
poj 1001答案
POJ2968代码有用,欢迎下载,POJ代码
poj 1440解题报告 poj 1440解题报告 poj 1440解题报告 poj 1440解题报告