POJ3349 Snowflake Snow Snowflakes(hash)

本文介绍了一种基于取余哈希方法的雪花相似性匹配算法,通过对比雪花棱上的数值来寻找完全相同的雪花图案。使用排序和哈希技术简化了匹配过程,并详细展示了算法的具体实现。

题意:

雪花有六条棱,每条棱对应一个数,要求在一组雪花中看能否寻找到所有棱对应相同的雪花(棱有顺序要求)。

要点:

刚自学了一下hash,这题刚上手有点思路但自己实在也写不出来,看了网上的代码觉得还是很简单的。首先这题只要用取余hash即可,将每条棱求和进行取余hash,然后用m[sum]记录有几个雪花sum相同,然后用snow[sum][m[sum]]存储这个雪花即可,还是比较简单的,这题的key值要设成一个比较大的素数,同时也要兼顾一下数组的范围,所以也不能太大。


15448052Seasonal3349Accepted27620K3000MSC++912B2016-04-28 19:28:34
#include<cstdio>
#include<algorithm>
#define maxn 10000
#define key 9997
using namespace std;
struct node
{
	int f[7];
};
int m[maxn];//存储sum相同的雪花个数
node snow[maxn][100];

bool cmp(node a, node b)
{
	sort(a.f, a.f + 6);		//先排序再比较即可
	sort(b.f, b.f + 6);
	for (int i = 0; i < 6; i++)
	{
		if (a.f[i] != b.f[i])
			return false;
	}
	return true;
}
int main()
{
	int n,i,j;
	while (scanf("%d", &n) != EOF)
	{
		memset(m, 0, sizeof(m));
		bool ok = false;
		while(n--)
		{
			int sum = 0;
			node temp;
			for (i = 0; i < 6; i++)
			{
				scanf("%d", &temp.f[i]);
				sum = (sum + temp.f[i]) % key;//求和进行简单的取余hash,这里要进行取余操作否则数组会过大
			}
			if (!ok)
			{
				for (i = 0; i < m[sum]; i++)
				{
					if (cmp(temp, snow[sum][i]))
					{
						ok = true;
						break;
					}
				}
				snow[sum][m[sum]] = temp;	//snow记录总和为sum中的第m[sum]个关键字
				m[sum]++;
			}
		}
		if (ok)
			printf("Twin snowflakes found.\n");
		else
			printf("No two snowflakes are alike.\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值