POJ3349 Snowflake Snow Snowflakes(hash)

题意:

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

要点:

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


15448052 Seasonal 3349 Accepted 27620K 3000MS C++ 912B 2016-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;
}


posted @ 2016-04-28 19:41  seasonal  阅读(130)  评论(0编辑  收藏  举报