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.
");
			else
				printf("No two snowflakes are alike.
");
	}
	return 0;
}


原文地址:https://www.cnblogs.com/gongpixin/p/4477416.html