pku 3349 Snowflake Snow Snowflakes 哈希

http://poj.org/problem?id=3349

用开散列的方式处理哈希,才开始的时候,在isok判断两个雪花是否行等时,我错认为只要找到一个相同的数字,然后顺时针逆时针寻找如果没能查找到就算是不想等了,两组数据可能有形同的数字不知一个,所以在这里贡献了好几次WA.笨啊。。。

例如数据:

2

1 2 3 2 4 5

2 4 5 1 2 3

应该是相同的。。。

挂链方式处理。。

View Code
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 177777
using namespace std;

struct node
{
int num;
node *next;
}*p[maxn],H[maxn];

int n,a[maxn][7],pos;

bool isok(int x,int y)
{
int i,j;
for (i = 0; i < 6; ++i)
{
if (a[x][i] == a[y][0])
{
for (j = 1; j < 6; ++j)
{
if (a[x][(i + j)%6] != a[y][j])
{
break;
}
}
if (j == 6) return true;
for (j = 1; j < 6; ++j)
{
if (a[x][(i - j + 6)%6] != a[y][j])
{
break;
}
}
if (j == 6) return true;
//break;//就是因为这个break让我贡献了好几次wa。。
}
}
return false;
}
int main()
{
int i,j;
bool flag;
while (~scanf("%d",&n))
{
memset(p,0,sizeof(p));
pos = 0;
node *it; flag = false;
for (i =0 ; i < n; ++i)
{
int sum = 0;
for (j = 0; j < 6; ++j)
{
scanf("%d",&a[i][j]);
sum += a[i][j];
}
if (!flag)
{
int tmp = sum % maxn;
// printf(">>%d\n",tmp);
for (it = p[tmp]; it != NULL; it = it->next)
{
if (isok(it->num,i))
{
flag = true;
break;
}
}
if (!flag)
{
node *q;
q = &H[pos++];
q->num = i;
q->next = p[tmp];
p[tmp] = q;
}
}
}
if (!flag)
{
printf("No two snowflakes are alike.\n");
}
else
{
printf("Twin snowflakes found.\n");
}
}
return 0;
}

vector<int>处理

View Code
#include <cstdio>
#include <cstdio>
#include <iostream>
#include <vector>
#define maxn 100007
using namespace std;

int a[maxn][10];
vector<int> hash[maxn];

bool isok(int x,int y)
{
int i,j;
for (i = 0; i < 6; ++i)
{
if (a[x][i] == a[y][0])
{
for (j = 1; j < 6; ++j)//顺时针查看
{
if (a[x][(i + j)%6] != a[y][j])
{
break;
}
}
if (j == 6) return true;
for (j = 1; j < 6; ++j)//逆时针查看
{
if (a[x][(i - j + 6)%6] != a[y][j])
{
break;
}
}
if (j == 6) return true;
}
}
return false;
}


int main()
{
int i,j,n;
while (~scanf("%d",&n))
{
bool flag = false;
for (i = 0; i < maxn; ++i)
hash[i].clear();
for (i = 0; i < n; ++i)
{
int sum = 0;
for (j = 0; j < 6; ++j)
{
scanf("%d",&a[i][j]);
sum += a[i][j];
}
if (!flag)
{
int tmp = sum%99991;//哈希映射处理
for (j = 0; j < hash[tmp].size(); ++j)
{
if (isok(hash[tmp][j],i))//查找是否有同构的
{
flag = true;
break;
}
}
if (!flag)
{
hash[tmp].push_back(i);
}
}
}
if (flag) printf("Twin snowflakes found.\n");
else printf("No two snowflakes are alike.\n");
}
return 0;
}



posted @ 2012-03-26 21:14  E_star  阅读(224)  评论(0编辑  收藏  举报