数据量很大,需要比对,因此用哈希,存储数据,把六片雪花的长度和作为关键值 然后比较顺时针或者逆时针是否相等,找到一组相等就可以不用比较,只读数据了 暑假的时候觉得这道题很难,现在做起来感觉比较轻松了,继续加油! 代码: #include<iostream> using namespace std; const int MAX=500005; typedef struct node { int a[6]; struct node *next; }snowflake; snowflake mempool[100005]; snowflake *adj[MAX]; int k,n; int main() { int i,j,sum; bool found=false,flag; scanf("%d",&n); for(i=1;i<MAX;i++) adj[i]=NULL; k=0; snowflake *cur; while(n--) { sum=0; snowflake *temp=&mempool[k++]; for(i=0;i<6;i++) { scanf("%d",&temp->a[i]); sum+=temp->a[i]; } if(found) continue; sum=sum%MAX; cur=adj[sum]; if(!cur) { temp->next=adj[sum]; adj[sum]=temp; continue; } while(cur) { for(i=0;i<6;i++)//判断顺时针方向是否相等 { //看temp的a[i]与cur的a[0]是否相等 flag=true; for(j=0;j<6;j++) { if(temp->a[j]!=cur->a[(i+j)%6])//数组下标指针右移j位 { flag=false; break; } } if(flag) { found=true; break; } } for(i=0;i<6;i++)//判断逆时针是否相等 { flag=true; for(j=0;j<6;j++) { if(temp->a[j]!=cur->a[(i-j+6)%6])//数组下标左移j位 { flag=false; break; } } if(flag) { found=true; break; } } cur=cur->next; } temp->next=adj[sum]; adj[sum]=temp; } if(found) puts("Twin snowflakes found."); else puts("No two snowflakes are alike."); return 0; }