题目:http://poj.org/problem?id=3349
题意:输入n个含6个整数的数组,判断这些数组是否有相同的。相同的条件为:正向或者反向相应顺序相同,如1 2 3 4 5 6 与 4 3 2 1 6 5就是相同的。
解法:哈希表。今天上午重新看了眼哈希表各种性质的证明,感觉有所启发,就决定找到哈希的题写写看。哈希的h函数为6个数之和。首先判断输入各组的输入之和是否有相同的,如果有相同的,则具体分情况判断。哈希表解决冲突的方法为拉链。本来想模拟个链表,但发现,这样反而超时,于是决定直接给每个槽100个单元,因为每个key相同的元素个数的期望为不到10个,因而决定碰运气,希望不出现最坏情况。结果AC了。
代码:
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int flag;
int len;
int next[100][6];
};
Node t[15000];
int compare(int a[],int b[])
{
int i,j;
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
{
if(a[(i+j)%6]!=b[j%6])
break;
}
if(j==6) return 1;
for(j=0;j<6;j++)
{
if(a[(i+j)%6]!=b[5-j])
break;
}
if(j==6) return 1;
}
return 0;
}
int main()
{
int ll,flag,sum,n,i,j,k,temp[6];
scanf("%d",&n);
flag=0;
for(i=0;i<14999;i++)
{
t[i].flag=0;
}
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<6;j++)
{
scanf("%d",temp+j);
sum+=temp[j];
}
sum%=10001;
if(flag) continue;
if(!t[sum].flag)
{
t[sum].flag=1;
ll=t[sum].len;
for(j=0;j<6;j++)
t[sum].next[ll][j]=temp[j];
t[sum].len=1;
}
else
{
ll=t[sum].len;
for(j=0;j<ll;j++)
{
if(compare(t[sum].next[j],temp))
{
flag=1;
break;
}
}
if(!flag)
{
for(k=0;k<6;k++)
t[sum].next[ll][k]=temp[k];
t[sum].len++;
}
}
}
if(flag)
printf("Twin snowflakes found.n");
else
printf("No two snowflakes are alike.n");
}
Leave a Reply