哈尔滨理工大学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 }