先写哈希查找。
第一个方法,获取通过采取散列码,冲突管理由列表,这里是一个很好的方式与这种叙述性说明:http://blog.csdn.net/lyy289065406/article/details/6647351
这里是关于这道题比較短小精悍的代码:http://blog.csdn.net/angle555945/article/details/7347069
以下是我的代码:
#include<iostream> #include<cstring> using namespace std; const int chushu=99991; int map[100010][7]; struct n1 { int i,sum; n1 *next; }; n1 hash[chushu+1]; inline void read(int &x) { scanf("%d",&x); } bool issame(int *a,int *b) { int i,j; for(i=0;i<6;i++) { for(j=0;j<6&&(a[j]==b[(j+i)%6]);j++) { if(j==5) return 1; } for(j=0;j<6&&(a[5-j]==b[(j+i)%6]);j++) { if(j==5) return 1; } } return 0; } bool insert(int sum,int i) { int key=sum%chushu; n1 *p=&hash[key]; for(;p->next!=0;p=p->next)//若指向节点没有后继,则此节点也没有储存不论什么数据 if(p->sum==sum&&issame(map[p->i],map[i])) return 1; p->next=new(n1); p->next->next=0; p->i=i; p->sum=sum; return 0; } int main() { int i,n,j,sum,flag; flag=1; read(n); memset(hash,0,sizeof(hash)); for(i=0;i<n;i++) { sum=0; for(j=0;j<6;j++) read(map[i][j]),sum+=map[i][j]; if(flag) if(insert(sum,i)) flag=0; } if(flag==0) printf("Twin snowflakes found. "); else printf("No two snowflakes are alike. "); }