标签:style blog color 使用 os io strong 文件
今天学的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次,若还不相同,则说明这两片雪花在逆时针方向不等。
听了这么多,小盆友们是不是都会了呢?嘿嘿,附上代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 #include <algorithm> 6 using namespace std; 7 #define maxn 100010 8 #define pri 100007 9 vector<int> hash[pri]; 10 int snow[maxn][6]; 11 int n; 12 int cmp(int a,int b) 13 { 14 for(int i=0; i<6; i++) 15 { 16 if(snow[a][0]==snow[b][i%6] ) 17 if(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]) 18 return 1; 19 if(snow[a][5]==snow[b][i%6]) 20 if(snow[a][4]==snow[b][(i+1)%6] && snow[a][3]==snow[b][(i+2)%6] && snow[a][2]==snow[b][(i+3)%6] && snow[a][1]==snow[b][(i+4)%6] && snow[a][0]==snow[b][(i+5)%6]) 21 return 1; 22 } 23 return 0; 24 } 25 int main() 26 { 27 scanf("%d",&n); 28 int i,j; 29 for(i=0; i<n; i++) 30 { 31 scanf("%d%d%d%d%d%d",&snow[i][0],&snow[i][1],&snow[i][2],&snow[i][3],&snow[i][4],&snow[i][5]); 32 } 33 int sum,flag=1,key; 34 for(i=0; i<n&&flag!=0; i++) 35 { 36 sum=0; 37 for(j=0; j<6; j++) 38 sum+=snow[i][j]; 39 key=sum%pri; 40 for(j=0; j<hash[key].size(); j++) 41 { 42 if(cmp(i,hash[key][j])) 43 { 44 flag=0; 45 puts("Twin snowflakes found."); 46 break; 47 } 48 } 49 hash[key].push_back(i); 50 } 51 if(flag==1) 52 puts("No two snowflakes are alike."); 53 return 0; 54 }
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,布布扣,bubuko.com
hash应用以及vector的使用简介:POJ 3349 Snowflake Snow Snowflakes
标签:style blog color 使用 os io strong 文件
原文地址:http://www.cnblogs.com/PJQOOO/p/3893259.html