判断n朵雪花中,是否有完全一样的雪花。一道比较简单的hash,我们将雪花的六个边的权值加
起来,记为sum,将sum相等的雪花归为一类,再在这里面根据题意找完全相同的,在同类中找到
一个角相同的,然后判断顺时针或者逆时针的所有角是否一模一样。
/*Accepted 3828K 3204MS C++ 1675B 2012-08-24 10:44:15*/ #include<stdio.h> #include<stdlib.h> #include<vector> using namespace std; const int prime = 19999; const int MAXN = 100100; int sf[MAXN][6]; vector<int> hash[20000]; void HASH(int i, int sum) { int j, key; key = sum % prime; hash[key].push_back(i); } bool cmp(int x, int y) { bool flag = false; int i, j; for(i = 0; i < 6; i ++) { if(sf[x][0] == sf[y][i]) { for(j = 1; j < 6; j ++) { if(sf[x][j] != sf[y][(i + j) % 6]) break; } if(j == 6) flag = true; for(j = 1; j < 6; j ++) { if(sf[x][6 - j] != sf[y][(i + j) % 6]) break; } if(j == 6) flag = true; } } return flag; } bool check() { int i, j, k; for(i = 0; i < 20000; i ++) { for(j = 0; j < hash[i].size(); j ++) { for(k = j + 1; k < hash[i].size(); k ++) { if(cmp(hash[i][j], hash[i][k])) return true; } } } return false; } int main() { int n, i, j, sum; while(scanf("%d", &n) == 1) { for(i = 0; i < n; i ++) { sum = 0; for(j = 0; j < 6; j ++) { scanf("%d", &sf[i][j]); sum += sf[i][j]; } HASH(i, sum); } if(check()) printf("Twin snowflakes found.\n"); else printf("No two snowflakes are alike.\n"); } return 0; }