poj 3349 Snowflake Snow Snowflakes 哈希

来源:互联网 发布:企业如何注册域名 编辑:程序博客网 时间:2024/05/17 09:31

题意:判断是否有两朵相同的雪花,相同条件为,相邻的瓣长度相等

http://blog.csdn.net/lyy289065406/article/details/6647351 这里的讲解不错~~

代码如下:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1000000;const int divi = 999983;struct node{    int x[7];}leaf[maxn];struct node1{    int v, next;}edge[maxn];int value, pre[maxn], n;bool issame(int num){    int i, j, k, t, tt, tmp;    int aa, bb, flag = 0;   // cout<<num<<"  "<<pre[num]<<"  "<<edge[pre[num]].next<<"  "<<edge[edge[pre[num]].next].next<<endl;    for( i= pre[num]; i!= -1 && edge; i= edge[i].next){        for( j= edge[i].next; j!= -1; j = edge[j].next){            aa = edge[i].v;            bb = edge[j].v;          //  cout<<aa<<"  "<<bb<<endl;            flag = 0;            for( tt= 0; tt<6; tt++){                flag = 0;                for( t= 0, k= 0; t<6; t++, k++){                    if( leaf[aa].x[t] != leaf[bb].x[(tt+k)%6]){                        flag = 1;                        break;                    }                }                if( flag == 0) return true;            }            for( tt= 0; tt<6; tt++){                flag = 0;                for( t= 0, k= 5; t<6; t++, k--){                    if( leaf[aa].x[t] != leaf[bb].x[(tt+k)%6]){                        flag = 1;                        break;                    }                }                if( flag == 0) return true;            }        }    }    return false;}int main(){  // freopen("1.txt", "r", stdin);    int i, j, k, tmo, sum, flag;    int sno[7], snow[7];    while( scanf("%d", &n) != EOF){        sum = 0; value = 0;flag= 0;        memset( pre, -1, sizeof( pre));        for( i= 0; i<n; i++){            sum = 0;            for( j= 0; j<6; j++){                scanf("%d", &leaf[i].x[j]);                sum += (leaf[i].x[j]%divi);            }            sum%= divi;            if( pre[sum] != -1) flag = 1;            edge[value].v = i;            edge[value].next = pre[sum];            pre[sum] = value ++;          //  cout<<sum<<"  "<<i<<"  "<<pre[sum]<<"  "<<value-1<<endl;        }     //   cout<<"sum  i  pre  value"<<endl;        if( flag == 0) {            printf("No two snowflakes are alike.\n");            continue;        }        flag = 0;        for( i= 0; i<divi; i++){            if( pre[i] == -1) continue;            if( edge[pre[i]].next == -1) continue;            if( issame(i)) {flag = 1;break;}        }        if( flag == 1)printf("Twin snowflakes found.\n");        else printf("No two snowflakes are alike.\n");    }    return 0;}


原创粉丝点击