首页 > 代码库 > 哈尔滨理工大学2016新生赛H题

哈尔滨理工大学2016新生赛H题

陈月亮最喜欢的季节就是冬天了,这不看着窗外飘起了雪花,陈月亮开心的跑出屋来看雪。但是迷迷糊糊的陈月亮不知道自己是在做梦还是真的下起了雪。突然她想起了一句话,在真实世界中是没有两片一样的雪花的。于是你的任务就是比较这场雪中的所有雪花,如果出现了两朵完全一致的雪花,则证明陈月亮是在梦中。

每朵雪花用六个整数表示,范围在(1 – 10000000)之间,表示雪花六个花瓣的长度,六个整数的先后出现顺序可能是顺时针顺序也可能是逆时针顺序,并且可能是从任意一个花瓣开始的。比如说对同一个花瓣,描述方法可能是1 2 3 4 5 6 或者 4 3 2 1 6 5

Input

第一行为一个整数T,表示有T组测试数据。

每组测试数据第一行为一个整数N(0 < N <= 100000),表示雪花的数目。

接下来n行每行六个整数,描述一朵雪花。

Output

如果没有相同的雪花,输出“No two snowflakes are alike.”,否则输出“Twin snowflakes found.”

Sample Input

1

2

1 2 3 4 5 6

4 3 2 1 6 5 

Sample Output

Twin snowflakes found. 

每读入一片雪花,就将该雪花进行哈希操作,并判断哈希表里是否有相同的哈希值,如有相同的哈希值就从链表中一一取出并判断是否同构即可。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <stdlib.h>
 4 #include <vector>
 5 using namespace std;
 6 
 7 const int M = 90001; //myhash函数,取余的数
 8 
 9 int snow[100005][6]; //存储雪花信息
10 vector<int> myhash[M]; //myhash表,表中存储的是snow数组的下标
11 
12 bool isSame(int a, int b)//判断a与b是否同样 
13 {
14     for(int i=0;i<6;i++)
15     {
16         //顺时针
17         if((snow[a][0] == snow[b][i] &&
18                     snow[a][1] == snow[b][(i+1)%6] &&
19                     snow[a][2] == snow[b][(i+2)%6] &&
20                     snow[a][3] == snow[b][(i+3)%6] &&
21                     snow[a][4] == snow[b][(i+4)%6] &&
22                     snow[a][5] == snow[b][(i+5)%6])
23                 ||   //逆时针
24                 (snow[a][0] == snow[b][i] &&
25                  snow[a][1] == snow[b][(i+5)%6] &&
26                  snow[a][2] == snow[b][(i+4)%6] &&
27                  snow[a][3] == snow[b][(i+3)%6] &&
28                  snow[a][4] == snow[b][(i+2)%6] &&
29                  snow[a][5] == snow[b][(i+1)%6]))
30 
31             return true;
32     }
33     return false;
34 }
35 
36 int main()
37 {
38     freopen("h.out", "w", stdout);
39     int T;
40     cin >> T;
41     while (T--) {
42         int ok = 0;
43         int n;
44         int i,j;
45         cin>>n;
46         for( i = 0; i < n; i++) 
47             for( j = 0; j < 6; j++)
48                 cin>>snow[i][j];
49 
50         int sum, key;
51         for(i = 0; i < n; i++) 
52         {
53             sum = 0;//求出雪花六个花瓣的和
54             for( j = 0; j < 6; j++) 
55                 sum += snow[i][j];
56             key = sum % M; //求出key
57 
58             //判断是否与myhash表中myhash[key]存储的雪花相同
59             for(vector<int>::size_type j = 0; j < myhash[key].size(); j++) 
60             {
61                 if(isSame(myhash[key][j], i))//如相同 
62                 {
63                     cout<<"Twin snowflakes found."<<endl;
64                     ok = 1;
65                     break;
66                 }
67             }
68             if (ok) {
69                 break;
70             }
71             myhash[key].push_back(i);//若没找到相同的 
72         }
73         if (ok == 0) 
74             cout<<"No two snowflakes are alike."<<endl;
75     }
76     return 0;
77 }

 

哈尔滨理工大学2016新生赛H题