C 雪花算法

  1. #include<stdio.h>  
  2. #include<stdlib.h>;  
  3. #include<algorithm>  
  4. #define inf 100001  
  5. using namespace std;   
  6. struct Edge{  
  7.     int a[10],next;  
  8. }edge[100100];  
  9. int a[10],head[100100],cnt;  
  10. bool add(int * b){  
  11.     int sum=0,i,j,p,q;  
  12.     for(i=0;i<6;i++)  
  13.         sum+=b[i];  
  14.     int hash=sum%inf;  
  15.     for(i=head[hash];i;i=edge[i].next){  
  16.         for(j=0;j<6;j++){  
  17.             if(edge[i].a[j]==b[0]){  
  18.                 for(p=0,q=j;p<6;p++){  
  19.                     if(b[p]!=edge[i].a[q])  
  20.                         break;  
  21.                         q=(q+1)%6;  
  22.                 }  
  23.                 if(p==6)return 1;  
  24.                 for(p=0,q=j;p<6;p++){  
  25.                     if(b[p]!=edge[i].a[q])  
  26.                         break;  
  27.                     q=(q-1+6)%6;  
  28.                 }  
  29.                 if(p==6)return 1;  
  30.             }  
  31.         }  
  32.     }  
  33.     ++cnt;  
  34.     for(i=0;i<6;i++)  
  35.         edge[cnt].a[i]=b[i];  
  36.     edge[cnt].next=head[hash];  
  37.     head[hash]=cnt;  
  38.     return 0;  
  39. }  
  40. int main(){  
  41.     int i,j,n;  
  42.     scanf("%d",&n);  
  43.     bool flag=0;  
  44.     for(i=1;i<=n;i++){  
  45.         for(j=0;j<6;j++){  
  46.             scanf("%d",&a[j]);  
  47.         }  
  48.         if(flag)continue;  
  49.         if(add(a))flag=1;  
  50.     }  
  51.     if(flag)              
  52.         printf("Twin snowflakes found.\n");          
  53.     else              
  54.         printf("No two snowflakes are alike.\n");  
  55. }  
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

akai9898

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值