大致题意:

在n (n<100000)个雪花中判断是否存在两片完全相同的雪花,每片雪花有6个角,每个角的长度限制为1000000

两片雪花相等的条件:

雪花6个角的长度按顺序相等(这个顺序即可以是顺时针的也可以是逆时针的)

 

 1 //哈希函数
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<stdlib.h>
 5 #include<algorithm>
 6 const int INF=1000007;
 7 int flag,t;
 8 int hash[INF];
 9 
10 int s[INF][6];
11 int st[INF][6];
12 int next[INF];
13 int hah(int st[])
14 {
15     long long u=0;
16     for(int i=0;i<6;i++)
17         u=u*10+st[i];
18     return u%INF;
19 }
20 int try_cmp(int s)
21 {
22     int h=hah(st[s]);
23     for(int i=hash[h];i!=-1;i=next[i])
24     {
25         if(memcmp(st[i],st[s],sizeof(st[s]))==0)//比较是否被标记,若是,返回0;
26           return 0;
27     }
28     next[s]=hash[h];
29     hash[h]=s;
30     return 1;
31 
32 }
33 void sow()
34 {
35 
36        for(int i=0;i<6;i++)
37            scanf("%d",&s[0][i]);//输入第一组数据,不许对比
38        std::sort(s[0],s[0]+6);
39        memcpy(st[0],s[0],sizeof(s[0]));
40        try_cmp(0);
41    for(int j=1;j<t;j++)//从输入第二组数据开始,检验是否在数组中有标记,若有,则发现相同雪花,否则,将其标记
42    {
43        for(int i=0;i<6;i++)
44            scanf("%d",&s[j][i]);
45        std::sort(s[j],s[j]+6);
46        memcpy(st[ j],s[j],sizeof(s[j]));
47        if(!try_cmp(j))
48          flag=1;
49    }
50    if(flag)
51      printf("Twin snowflakes found.\n");
52    else printf("No two snowflakes are alike.\n");
53 }
54 int main()
55 {
56      while(~scanf("%d",&t))
57      {
58          flag=0;
59          memset(hash,-1,sizeof(hash));
60          sow();
61      }
62      return 0;
63 }
View Code

 

posted on 2013-08-23 15:57  Fann0221  阅读(211)  评论(0编辑  收藏  举报