您的位置:首页 > 其它

POJ3349 Snowflake Snow Snowflakes(hash)

2016-04-28 19:40 429 查看
题意:

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

要点:

刚自学了一下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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: