题意:每个雪花都有六个角,给出n个雪花的六个角的长度,问其中有没有相同的两片雪花。若有则输出:Twin snowflakes found. 否则输出:No two snowflakes are alike.
题解:简单哈希。将每个雪花的六个角的长度加起来,存在一个vector里,判断有相同长度和的两片雪花是否相同。注意,这里逆反两个方向多要判断。
1 #include<iostream> 2 #include<vector> 3 #include<cstdio> 4 using namespace std; 5 6 const int MOD=199999;//不能取的太大,否则运算慢会超时 7 vector<int>vec[MOD]; 8 int arm[100005][6]; 9 10 bool isSame(int st1,int st2){ 11 bool flag; 12 for(int i=0;i<6;i++){//clockwise 13 flag=true; 14 for(int j=i,k=0;k<6;k++,j=(j+1)%6){ 15 if(arm[st1][k]!=arm[st2][j]){ 16 flag=false; 17 break; 18 } 19 } 20 if(flag) return true; 21 } 22 for(int i=0;i<6;i++){//counterclockwise 23 flag=true; 24 for(int j=i,k=0;k<6;k++){ 25 if(arm[st1][k]!=arm[st2][j]){ 26 flag=false; 27 break; 28 } 29 if((--j)<0) j=5; 30 } 31 if(flag) return true; 32 } 33 return flag; 34 } 35 36 int main() 37 { 38 int n,sum; 39 bool flag; 40 while(scanf("%d",&n)!=EOF){ 41 flag=false; 42 for(int i=1;i<=n;i++){ 43 sum=0; 44 for(int j=0;j<6;j++){ 45 scanf("%d",&arm[i][j]); 46 if(flag) continue; 47 sum+=arm[i][j]; 48 } 49 if(flag) continue; 50 sum%=MOD; 51 for(int j=0;j<vec[sum].size();j++){ 52 if(isSame(vec[sum][j],i)){ 53 flag=true; 54 break; 55 } 56 } 57 vec[sum].push_back(i); 58 } 59 if(flag) puts("Twin snowflakes found."); 60 else puts("No two snowflakes are alike."); 61 } 62 return 0; 63 }