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;
}

POJ 3349 Snowflake Snow Snowflakes (哈希表)

时间: 2024-11-19 08:47:12

POJ 3349 Snowflake Snow Snowflakes (哈希表)的相关文章

POJ 3349 Snowflake Snow Snowflakes 哈希(链式解决冲突)

题意:n个数列 每个数列6个元素a[i],a[i]<=1e7,两个数列只要,经过若干次循环移动能相等则定义为相似.n<=1e5,问n个数列中 是否存在两个数列相似? 每个数列只有6个数,则相似的最多12种,对每个数列算出其hash值 相同hash值插入同一个链表中.查看新输入的数列插入时是否产生冲突即可 O(n*12) #include <iostream> #include <cstdio> #include <cstring> #include <

POJ 3349 Snowflake Snow Snowflakes(哈希表)(转)

题意:判断有没有两朵相同的雪花.每朵雪花有六瓣,比较花瓣长度的方法看是否是一样的,如果对应的arms有相同的长度说明是一样的.给出n朵,只要有两朵是一样的就输出有Twin snowflakes found.,如果任何两个都是不一样的输出No two snowflakes are alike.n=100,000. 思路:最 简单的就是枚举每两片雪花,判断他们是否相同.时间复杂度为O(n*n),显然效果不理想.有没有更好的算法呢?hash:每读进一片雪花,将雪花 hash,判断hash表里是否有相同

poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)

Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30529   Accepted: 8033 Description You may have heard that no two snowflakes are alike. Your task is to write a program to determine whether this is really true. Y

hash应用以及vector的使用简介:POJ 3349 Snowflake Snow Snowflakes

今天学的hash.说实话还没怎么搞懂,明天有时间把知识点总结写了,今天就小小的写个结题报告吧! 题意: 在n (n<100000)个雪花中判断是否存在两片完全相同的雪花,每片雪花有6个角,每个角的长度限制为1000000 两片雪花相等的条件: 雪花6个角的长度按顺序相等(这个顺序即可以是顺时针的也可以是逆时针的) 解题思路: hash:连加求余法 求key 值,链地址法解决冲突,连加求余法 求key 值挺简单,关于链地址法解决冲突可以通过c++中,vector容器可以较为方便的实现. 下面先介绍

哈希—— POJ 3349 Snowflake Snow Snowflakes

相应POJ题目:点击打开链接 Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 33595   Accepted: 8811 Description You may have heard that no two snowflakes are alike. Your task is to write a program to determine whether this is

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

Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30512   Accepted: 8024 Description You may have heard that no two snowflakes are alike. Your task is to write a program to determine whether this is really true. Y

POJ - 3349 Snowflake Snow Snowflakes (哈希)

题意:给定n(0 < n ≤ 100000)个雪花,每个雪花有6个花瓣(花瓣具有一定的长度),问是否存在两个相同的雪花.若两个雪花以某个花瓣为起点顺时针或逆时针各花瓣长度依次相同,则认为两花瓣相同. 分析: 1.按雪花各花瓣长度之和对MOD取余哈希.对各雪花,算出哈希值,在哈希表中查询是否有与之相同的花瓣. 2.每个花瓣以某个花瓣为起点顺时针或逆时针共有12种表示方法. 3.注意哈希表中只需保存雪花输入时给定的那组长度值即可. 在哈希表中查询时,再算出该组长度值所对应的12种表示,并一一比较,若

POJ 3349 - Snowflake Snow Snowflakes - [hash]

题目链接:http://poj.org/problem?id=3349 Time Limit: 4000MS Memory Limit: 65536K Description You may have heard that no two snowflakes are alike. Your task is to write a program to determine whether this is really true. Your program will read information

POJ 3349 Snowflake Snow Snowflakes

题意:一个长度为6的序列表示一片雪花的六个胳膊(?)的长度,给出n个雪花,问存不存在两片一样的,一样的就是两个雪花旋转或者翻转后胳膊的长度是一样的…… 解法:哈希.以前并没有做过对数字序列哈希……先用map搞了搞,然后T了……百度了一下,只要将序列元素和进行哈希就可以了,对于索引的选取,一开始选了10n+7,然而T了……不是说越大哈希完了越分散么……想了想觉得是因为用vector搞的初始化太耗时……于是把索引减小吧……5003是个不错的选择……嗯?我怎么知道的?哈哈哈哈当然是我过于机智……嗯?你