题意:每片雪花有六瓣,给出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; }
POJ 3349 Snowflake Snow Snowflakes (哈希表)
时间: 2024-11-19 08:47:12