首页 > 代码库 > POJ 3349 Snowflake Snow Snowflakes (哈希表)
POJ 3349 Snowflake Snow Snowflakes (哈希表)
题意:每片雪花有六瓣,给出n片雪花,六瓣花瓣的长度按顺时针或逆时针给出,判断其中有没有相同的雪花(六瓣花瓣的长度相同)
思路:如果直接遍历会超时,我试过。这里要用哈希表,哈希表的关键码key用六瓣花瓣的长度的和取余一个数得到,表中为雪花的存储位置address(即在snowflakes数组中的位置)
代码:
#include<iostream>#include<vector>using namespace std;const int maxn=100000+100;//雪花最多数目const int mo=98765;//哈希取余的数int snowflakes[maxn][6];//存储雪花信息vector<int>hash[mo];//哈希表bool issame(int a,int b){ for(int j=0;j<6;j++) { if(/*顺时针方向*/ (snowflakes[a][0] == snowflakes[b][j] && snowflakes[a][1] == snowflakes[b][(j+1)%6] && snowflakes[a][2] == snowflakes[b][(j+2)%6] && snowflakes[a][3] == snowflakes[b][(j+3)%6] && snowflakes[a][4] == snowflakes[b][(j+4)%6] && snowflakes[a][5] == snowflakes[b][(j+5)%6]) || /*逆时针方向*/ (snowflakes[a][0] == snowflakes[b][j] && snowflakes[a][1] == snowflakes[b][(j+5)%6] && snowflakes[a][2] == snowflakes[b][(j+4)%6] && snowflakes[a][3] == snowflakes[b][(j+3)%6] && snowflakes[a][4] == snowflakes[b][(j+2)%6] && snowflakes[a][5] == snowflakes[b][(j+1)%6]) ) return true; } return false;}int main(){ int n; bool exist=false; while(scanf("%d",&n)!=EOF) { int i,j,k; for(i=0;i<n;i++) for(j=0;j<6;j++) scanf("%d",&snowflakes[i][j]); int sum,key; for(i=0;i<n;i++) { sum=0; for(j=0;j<6;j++) sum+=snowflakes[i][j]; key=sum%mo;//作为哈希表的key vector<int>::iterator it; for(it=hash[key].begin();it!=hash[key].end();it++)//遍历哈希表中key相同的雪花 if(issame(*it,i)) { exist=true; break; } hash[key].push_back(i); } if(exist) printf("Twin snowflakes found.\n"); else printf("No two snowflakes are alike.\n"); } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。