POJ 3349 Snowflake Snow Snowflakes

      上次在BFS的时候需要hash判重,但是很少接触hash的用法,其实还是和数据结构讲得一样,就是用一个公式起到一个映射的作用,用在搜索上可是缩小查找范围。

代码:

#include<iostream>
#include<vector>
using namespace std;
#define maxn 10949  //hash的大小最好是素数 
vector<int> hash[maxn];
int arm[100005][6];
bool comp(int a,int b)  //判断雪花是否相同 忘了return false 害了我wa了4次。
{
     int i,j,k;
     for( i=0;i<6;i++){
          if( arm[a][0]==arm[b][i]){
              for( j=(i-1+6)%6, k=1 ; k<6 && arm[a][k]==arm[b][j]; j=((--j)+6)%6, k++);//逆时针比较
              if( k==6 ) return true;
              for( j=(i+1)%6 ,k=1; k<6 && arm[a][k]==arm[b][j]; j=(++j)%6 ,k++) ;  //顺时针
              if( k==6) return true; 
          }
     }   
     return false;       
}
int main()
{
    int n,i,sum,j,len,r;
    while( scanf("%d",&n)!=EOF){
           
           memset(arm,0,sizeof(arm));
           for( i=0;i<maxn;i++) hash[i].clear();
           bool flag=false;
           
           for( i=0;i<n&&!flag;i++){
                  sum=0;
                  for( j=0;j<6;j++){
                       scanf("%d",&arm[i][j]);
                       sum+=arm[i][j];
                  }
                  r=sum%maxn;
                  len=hash[r].size();
                  for( j=0;j<len;j++){  //在 和 相同的前提下比较有没有相同的雪花
                       if( comp( i, hash[r][j] ) ){
                           flag=true;
                           break;
                       }
                  }
                  if(!flag) hash[r].push_back(i);
           }
           if( flag){
               for( ;i<n;i++){  //边输入边判断可能还有没有输完的
                      for(j=0;j<6;j++) 
                      scanf("%*d");  
               }
               printf("Twin snowflakes found.\n");
           }
           else
               printf("No two snowflakes are alike.\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值