121 2 3 4 5 64 3 2 1 6 5样例输出Twin snowflakes found.解题报告:Hash算法的简单应用。对arms和Hash下就行了。
code:
#include<iostream>#include<stdio.h>#include<queue>#include<vector>#include<stack>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const int maxn=100005;const int gcd=100000;int snow[maxn][6]; //存雪花arms值vector<int> v[maxn]; //存相同arms和的雪花bool deal(int a,int b){ //比较两个雪花是否相同 for(int i=0;i<6;i++){ if( (snow[a][0]==snow[b][i] && //顺时针比较 snow[a][1]==snow[b][(i+1)%6] && snow[a][2]==snow[b][(i+2)%6] && snow[a][3]==snow[b][(i+3)%6] && snow[a][4]==snow[b][(i+4)%6] && snow[a][5]==snow[b][(i+5)%6]) || (snow[a][0]==snow[b][i] && //逆时针比较 snow[a][1]==snow[b][(i+5)%6] && snow[a][2]==snow[b][(i+4)%6] && snow[a][3]==snow[b][(i+3)%6] && snow[a][4]==snow[b][(i+2)%6] && snow[a][5]==snow[b][(i+1)%6]) ) return true; } return false;}int main(){ // freopen("input.txt","r",stdin); int t,n; scanf("%d",&t); while(t--){ memset(snow,0,sizeof(snow)); for(int i=0;i<maxn;i++){ //初始化 v[i].clear(); } scanf("%d",&n); for(int i=0;i<n;i++){ int sum=0; for(int j=0;j<6;j++){ scanf("%d",&snow[i][j]); sum+=snow[i][j]; } sum=sum%gcd; v[sum].push_back(i); } int flag=0; //默认无相同雪花 for(int i=0;i<maxn;i++){ if(flag) break; if(v[i].size()>=2){ for(int j=0;j<v[i].size()-1;j++){ for(int k=j+1;k<v[i].size();k++){ if(deal(v[i][j],v[i][k])){ flag=1; break; } } } } } if(!flag) printf("No two snowflakes are alike./n"); else printf("Twin snowflakes found./n"); } return 0;}
新闻热点
疑难解答