http://poj.org/problem?id=3349
题意:
给出n片雪花留个角的长度,要求判断是否有一样的雪花。
思路:
Hash表的应用。
首先将每个雪花所有角的总长计算出来,如果两片雪花相同的话那么总长也是相同的,然后加入vector容器当中,最后遍历vector数组,如果某个总长有大于1的雪花数,则有可能存在相同的雪花,此时需要比较这些雪花。
1 #include <iostream> 2 #include <stdio.h> 3 #include <vector> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 const int maxn = 100002; 8 const int prime = 99991; 9 10 struct node 11 { 12 int len[6]; 13 }snow; 14 15 vector<node>hs[prime]; 16 17 18 bool judge(node a, node b) 19 { 20 for (int i = 0; i<6; i++) 21 { 22 if (a.len[0] == b.len[i] && a.len[1] == b.len[(i + 1) % 6] && a.len[2] == b.len[(i + 2) % 6] && 23 a.len[3] == b.len[(i + 3) % 6] && a.len[4] == b.len[(i + 4) % 6] && a.len[5] == b.len[(i + 5) % 6]) 24 return true;//固定a,顺时针比较 25 if (a.len[0] == b.len[i] && a.len[1] == b.len[(i + 5) % 6] && a.len[2] == b.len[(i + 4) % 6] && 26 a.len[3] == b.len[(i + 3) % 6] && a.len[4] == b.len[(i + 2) % 6] && a.len[5] == b.len[(i + 1) % 6]) 27 return true;//固定a, 逆时针比较 28 } 29 return false; 30 } 31 32 int main() 33 { 34 //freopen("D:\txt.txt", "r", stdin); 35 int n; 36 cin >> n; 37 while (n--) 38 { 39 for (int i = 0; i<6; i++) 40 scanf("%d", &snow.len[i]); 41 int sum = (snow.len[0] + snow.len[1] + snow.len[2] + snow.len[3] + snow.len[4] + snow.len[5]) % prime; 42 hs[sum].push_back(snow); 43 } 44 for (int i = 0; i<prime; i++) 45 if (hs[i].size()>1) //可能有相同的雪花 46 { 47 for (int j = 0; j<hs[i].size(); j++) 48 for (int k = j + 1; k<hs[i].size(); k++) 49 { 50 if (judge(hs[i][j], hs[i][k])) 51 { 52 printf("Twin snowflakes found."); 53 return 0; 54 } 55 } 56 } 57 printf("No two snowflakes are alike."); 58 return 0; 59 }