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