陈月亮最喜欢的季节就是冬天了,这不看着窗外飘起了雪花,陈月亮开心的跑出屋来看雪。但是迷迷糊糊的陈月亮不知道自己是在做梦还是真的下起了雪。突然她想起了一句话,在真实世界中是没有两片一样的雪花的。于是你的任务就是比较这场雪中的所有雪花,如果出现了两朵完全一致的雪花,则证明陈月亮是在梦中。
每朵雪花用六个整数表示,范围在(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 #include2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int M = 90001; //myhash函数,取余的数 8 9 int snow[100005][6]; //存储雪花信息10 vector 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; //求出key57 58 //判断是否与myhash表中myhash[key]存储的雪花相同59 for(vector ::size_type j = 0; j < myhash[key].size(); j++) 60 {61 if(isSame(myhash[key][j], i))//如相同 62 {63 cout<<"Twin snowflakes found."<