poj3349

第一次写哈希查找。

学的第一种方法,通过取余得到哈希码,通过链表处理冲突,这里是有关这种方法很好的描述:http://blog.csdn.net/lyy289065406/article/details/6647351

这里是关于这道题比较短小精悍的代码:http://blog.csdn.net/angle555945/article/details/7347069

下面是我的代码:

#include<iostream>
#include<cstring>
using namespace std;
const int chushu=99991;
int map[100010][7];
struct n1
{
	int i,sum;
	n1 *next;
};
n1 hash[chushu+1];
inline void read(int &x)
{
	scanf("%d",&x);
}
bool issame(int *a,int *b)
{
	int i,j;
	for(i=0;i<6;i++)
	{
		for(j=0;j<6&&(a[j]==b[(j+i)%6]);j++)
		{
			if(j==5)
				return 1;
		}
		for(j=0;j<6&&(a[5-j]==b[(j+i)%6]);j++)
		{
			if(j==5)
				return 1;
		}
	}
	return 0;
}
bool insert(int sum,int i)
{
	int key=sum%chushu;
	n1 *p=&hash[key];
	for(;p->next!=0;p=p->next)//若指向节点没有后继,则此节点也没有储存任何数据
		if(p->sum==sum&&issame(map[p->i],map[i]))
			return 1;
	p->next=new(n1);
	p->next->next=0;
	p->i=i;
	p->sum=sum;
	return 0;
}
int main()
{
	int i,n,j,sum,flag;
	flag=1;
	read(n);
	memset(hash,0,sizeof(hash));
	for(i=0;i<n;i++)
	{
		sum=0;
		for(j=0;j<6;j++)
			read(map[i][j]),sum+=map[i][j];
		if(flag)
			if(insert(sum,i))
				flag=0;
	}
	if(flag==0)
		printf("Twin snowflakes found.\n");
	else
		printf("No two snowflakes are alike.\n");
}

poj3349

时间: 2024-11-06 22:40:52

poj3349的相关文章

poj3349(Snowflake Snow Snowflakes)

题目地址:Snowflake Snow Snowflakes 题目大意: 给你N个雪花,每个雪花由6个长度构成,让你判断N哥雪花中是否有两个或两个以上的雪花是相似的,相似的规则是:有两个雪花a.b.b在任意位置顺时针或者逆时针转和a的大小顺序相同即为相似的雪花. 解题思路: 一般的方法如果时间复杂度是O(n^2)的都会超时,所以要尽量让N小,所有用个简单哈希.将6个数的和对N取余存到一个vector.然后再在vector里找看是否有相似的雪花. 代码: 1 #include <algorithm

POJ3349 Language: Snowflake Snow Snowflakes

POJ3349 Language: Snowflake Snow Snowflakes 题目:传送门 题解: 链表+hash的一道水题 填个坑补个漏... 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 typedef long long L

[poj3349]Snowflake Snow Snowflakes(hash)

Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 37615 Accepted: 9882 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

POJ3349 Snowflake Snow Snowflakes

Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 39075   Accepted: 10232 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 inf

Hash poj3349 Snowflake Snow Snowflakes

题意:判断是否有两片一样的雪花. Hash第一题,基本是抄的. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75

POJ3349: Snowflake Snow Snowflakes(hash 表)

考察hash表: 每一个雪花都有各自的6个arm值,如果两个雪花从相同或者不同位置开始顺时针数或者逆时针数可以匹配上,那么这两个雪花就是相等的. 我们采用hash的方法,这样每次查询用时为O(1),总用时为O(n). hash的本质是把值映射到地址或者下标,如果不同的key值对应到相同的indice上的话,就需要进行chaining处理,吧indice指向一个链表,链表的每一个节点存储共享同一indice的不同key值. 因此问题的核心变成:吧相等的雪花映射到相同的indice上.这里雪花是一个

poj3349(哈希+链地址法)

给出N个六边形的6个边长,问其中是否有完全相同的两个六边形,完全相同包括边的长度和位置都要相同.边给出的顺序是逆时针或者顺时针的. 给每个6边形一个哈希值,方法是对6条边长度的平方和取模 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn = 1e6; const int mod = 999983;//100W以内的大素数 typedef l

POJ3349 Snowflake Snow Snowflakes 【哈希表】

题目 很简单,给一堆6元组,可以从任意位置开始往任意方向读,问有没有两个相同的6元组 题解 hash表入门题 先把一个六元组的积 + 和取模作为hash值,然后查表即可 期望\(O(n)\) #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define LL long long int #define Redge(

poj3349(数字hash)

#include<cstdio> #include<cstring> using namespace std; const int maxn=100000+10; const int p=99991; int a[7]; bool check[maxn]; int next[maxn],adj[maxn]; int snow[maxn][10]; int tot; int H(int x[]){ int h1=0,h2=1; for (int i=0;i<6;i++){ h1