POJ 3349

来源:互联网 发布:库存软件哪个好 编辑:程序博客网 时间:2024/05/16 06:21

本题哈希,但judge的时间还是很长,哎;

#include <stdio.h>#include <memory.h>#define maxn 100003struct s{int arms[6];int amount;}snow[maxn];int head[maxn],next[maxn];//maxn大小的哈希表int judge(int *a,int *b){int i,j,ok=1,t=0;int k[6];for(i=0;i<6&&ok;i++){for(j=0;j<6;j++){if(a[i]==b[j]){ok=0;k[t++]=j;}}}if(t==0) return 0;for(;t>=0;t--){for(i=1;i<6;i++)//顺时针{if(a[i]!=b[(i+k[t])%6]) break;}if(i==6) return 1;for(i=1;i<6;i++)//逆时针{if(a[i]!=b[(k[t]-i+6)%6]) break;}if(i==6) return 1;}return 0;}int insert(int i){int loc=(snow[i].amount)%maxn;//哈希函数int u=head[loc];while(u!=-1){if((snow[u].amount==snow[i].amount)&&judge(snow[u].arms,snow[i].arms)) return 1;u=next[u];}    next[i]=head[loc];head[loc]=i;return 0;}int main(){int n;while(scanf("%d",&n)!=EOF){int flag=0;memset(head,-1,sizeof(head));int i,j;for(i=0;i<n;i++){snow[i].amount=0;for(j=0;j<6;j++){scanf("%d",&snow[i].arms[j]);snow[i].amount=snow[i].amount+snow[i].arms[j];//key关键字}if(insert(i)) flag=1;}if(flag) printf("Twin snowflakes found.\n");else printf("No two snowflakes are alike.\n");}return 0;}


 

原创粉丝点击