今天学的hash。说实话还没怎么搞懂,明天有时间把知识点总结写了,今天就小小的写个结题报告吧!

题意:

在n (n<100000)个雪花中判断是否存在两片完全相同的雪花,每片雪花有6个角,每个角的长度限制为1000000

两片雪花相等的条件:

雪花6个角的长度按顺序相等(这个顺序即可以是顺时针的也可以是逆时针的)

解题思路:

hash:连加求余法 求key 值,链地址法解决冲突,连加求余法 求key 值挺简单,关于链地址法解决冲突可以通过c++中,vector容器可以较为方便的实现。

下面先介绍一下vector容器:(其实今天也第一次接触vector容器)

1 基本操作

(1)头文件#include<vector>.

(2)创建vector对象,vector<int> vec;

(3)尾部插入数字:vec.push_back(a);

(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。

(5)使用迭代器访问元素.

vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;

(6)插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

(7)删除元素:    vec.erase(vec.begin()+2);删除第3个元素

vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

(8)向量大小:vec.size();

(9)清空:vec.clear();

具体思路:

当且仅当两片雪花的key值一样时,这两片雪花才有可能相同。

求出一组的key值后,在该key值的容器中寻找是否有相同的雪花若存在,break出来即可。

那么当我们寻找到key值相同的两片雪花时,我们该如何比较两片雪花?

其实是可以的。假设有两片雪花,A 和B

我们固定A,先按顺时针方向比较

若A0==B0,则按顺序比较A1和B1.........比较A5和B5

只要当出现Ai != Bi,则把B顺时针转动一次,

若A0==B1,则按顺序比较A1和B2.........比较A5和B0

以此类推,直至B转动了5次,若还不相同,则说明这两片雪花在顺时针方向不等。

再比较逆时针方向

同样固定A,若A0==B5,则按顺序比较A1和B4.........比较A5和B0

只要当出现Ai != B(5-i),则把B逆时针转动一次,

若A0==B4,则按顺序比较A1和B3.........比较A5和B5

以此类推,直至B转动了5次,若还不相同,则说明这两片雪花在逆时针方向不等。

听了这么多,小盆友们是不是都会了呢?嘿嘿,附上代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 100010
#define pri 100007
vector<int> hash[pri];
int snow[maxn][];
int n;
int cmp(int a,int b)
{
for(int i=; i<; i++)
{
if(snow[a][]==snow[b][i%] )
if(snow[a][]==snow[b][(i+)%] && snow[a][]==snow[b][(i+)%] && snow[a][]==snow[b][(i+)%] && snow[a][]==snow[b][(i+)%] && snow[a][]==snow[b][(i+)%])
return ;
if(snow[a][]==snow[b][i%])
if(snow[a][]==snow[b][(i+)%] && snow[a][]==snow[b][(i+)%] && snow[a][]==snow[b][(i+)%] && snow[a][]==snow[b][(i+)%] && snow[a][]==snow[b][(i+)%])
return ;
}
return ;
}
int main()
{
scanf("%d",&n);
int i,j;
for(i=; i<n; i++)
{
scanf("%d%d%d%d%d%d",&snow[i][],&snow[i][],&snow[i][],&snow[i][],&snow[i][],&snow[i][]);
}
int sum,flag=,key;
for(i=; i<n&&flag!=; i++)
{
sum=;
for(j=; j<; j++)
sum+=snow[i][j];
key=sum%pri;
for(j=; j<hash[key].size(); j++)
{
if(cmp(i,hash[key][j]))
{
flag=;
puts("Twin snowflakes found.");
break;
}
}
hash[key].push_back(i);
}
if(flag==)
puts("No two snowflakes are alike.");
return ;
}

There is a meaning for wings that cannot fly,it's a previous memory of when you once flew through the sky.

hash应用以及vector的使用简介:POJ 3349 Snowflake Snow Snowflakes的更多相关文章

  1. POJ 3349 Snowflake Snow Snowflakes (Hash)

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

  2. POJ 3349 Snowflake Snow Snowflakes

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

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

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

  4. 哈希—— POJ 3349 Snowflake Snow Snowflakes

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

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

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

  6. POJ 3349 Snowflake Snow Snowflakes Hash

    题目链接: http://poj.org/problem?id=3349 #include <stdio.h> #include <string.h> #include < ...

  7. [poj 3349] Snowflake Snow Snowflakes 解题报告 (hash表)

    题目链接:http://poj.org/problem?id=3349 Description You may have heard that no two snowflakes are alike. ...

  8. POJ 3349 Snowflake Snow Snowflakes(哈希)

    http://poj.org/problem?id=3349 题意 :分别给你n片雪花的六个角的长度,让你比较一下这n个雪花有没有相同的. 思路:一开始以为把每一个雪花的六个角的长度sort一下,然后 ...

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

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

随机推荐

  1. Python中打印列表的序号和内容

    ==>the start 最近作业里要用到遍历打印出列表中的序号和内容,我刚开始用了个很笨的方法来写,后来老师说可以使用enumerate()函数,所以我就特意研究了下. 先看我之前用的笨方法: ...

  2. duilib之源码分析

    <duilib之源码分析>1 stdAfx.h * lengthof(x) 计算数组长度宏 * MAX  两值最大 * MIN  两值最小 * CLAMP(x,a,b) x在a,b之间则取 ...

  3. linux: /usr/bin/ld: cannot find -lloc

    /usr/bin/ld: cannot find -lloc ld链接库的时候没发现loc这个库-lloc本事不是文件名字,要去找这个库就搜索libloc, loc, 不能搜索lloc. /usr1/ ...

  4. js判断是否为pc端或移动端

    function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = new Array("Android" ...

  5. 终于实现samba可写不可删除

    通过szxsztszk的提示 今天终于实现了linux可写不可删除的要求. 同时运用了POSIX ACL 我们公司的要求是这样的[color=Red](我只做出我公司要求的步骤,不同的要求,稍加改正即 ...

  6. ssh登录的时候,根本不给输入密码的机会,直接拒绝,是因为BatchMode的设置

    BatchMode no“BatchMode”如果设为“yes”,passphrase/password(交互式输入口令)的提示将被禁止.当不能交互式输入口令的时候,这个选项对脚本文件和批处理任务十分 ...

  7. premake在Ubuntu和GCC环境下创建简单的C++工程

    由于premake基于lua脚本,为了方便编辑lua脚本,我在emacs24中利用package system安装了lua-mode. 然后创建config.lua文件,填入下面这段,主要来自:htt ...

  8. 如何删除JAVA集合中的元素

    经常我们要删除集合中的某些元素.有些可能会这么写. public void operate(List list){ for (Iterator it = list.iterator(); it.has ...

  9. google浙大招聘笔试题 师兄只能帮你到这儿了

    google浙大招聘笔试题 一.单选1.80x86中,十进制数-3用16位二进制数表示为?00100002.假定符号-.*.$分别代表减法.乘法和指数运算,且 1)三个运算符优先级顺序是:-最高,*其 ...

  10. linux命令:rm

    删文件要一个个回答y,谁有好办法自动删除? rm -rf 用rm递归删除目录下面的所有.o文件: find . -name "*.o"  | xargs rm -f :