题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=130
题意:一个雪花有六个角,每个角对应一个值,给出N个雪花,问能不能是否存在两片相同的雪花(给出的角可能是逆序的);
解题思路:由于有很多雪花,因此数据很大,如果单纯的进行直接查询的话肯定会TE,因此可以用哈希的方法,其中哈希函数可以用每个雪花的各个角的和来定义;然后映射到相应的位置。一旦找到就不在进行哈希。
#include<iostream> #include<cstdio> using namespace std; struct snow { int a[6]; struct snow *next; }; snow *s[100005]; bool fun(int b[],int sum) { snow *p;p=s[sum]->next; while(p) { for(int i=0;i<6;i++) { if(b[i]==p->a[0]) { int j; for(j=1;j<6;j++) { if(b[(i+j)%6]!=p->a[j])break; } if(j==6)return true; for(j=1;j<6;j++) { if(b[((i-j)%6+6)%6]!=p->a[j])break; } if(j==6)return true; } } p=p->next; } p=new snow; for(int i=0;i<6;i++) { p->a[i]=b[i]; } p->next=s[sum]->next; s[sum]->next=p; return false; } int main() { int n;cin>>n; while(n--) { int m;cin>>m; for(int i=0;i<100000;i++) { s[i]=new snow;s[i]->next=NULL; } int flat=1; for(int i=0;i<m;i++) { int b[6];int sum=0; for(int j=0;j<6;j++) { scanf("%d",&b[j]);sum+=b[j]; } sum%=100000; if(flat) { if(fun(b,sum)) flat=0; } } if(!flat)printf("Twin snowflakes found.\n"); else printf("No two snowflakes are alike.\n"); } }