POJ 3349 Snowflake Snow Snowflakes 哈希

第一次做哈希 直接搜的題解,就當是照着葫蘆畫瓢吧代碼如下~~~~

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iostream>

using namespace std;

typedef struct node
{
    int a[6];
}item;

item snow[15000][20];//p爲14997
int m[15000];//記錄衝突的個數

int hash(item x)
{
    int key = 0;
    for(int i = 0;i < 6;i++){
        key += x.a[i];
    }
    return key%14997;
}
int cmp(item x, item y)
{
    int i, j, k;
    for(k = 0;k < 6;k++){
        for(i = k,j = 0;j < 6;j++,i = (i+1)%6){
            if(x.a[i]!=y.a[j]){
                break;
            }
        }
        if(j == 6)  return 1;
    }
    for(k = 0;k < 6;k++){
        for(i = k, j = 0;j < 6;j++,i = (i+5)%6){
            if(x.a[i]!=y.a[j])  break;
        }
        if(j == 6)  return 1;
    }
    return 0;
}
int main()
{
    int n;
    int i, j, pos;
    scanf("%d", &n);
    item temp;
    for(i = 1;i <= n;i++){
        for(j = 0;j < 6;j++){
            scanf("%d", &temp.a[j]);
        }
        pos = hash(temp);
        for(j = 0;j < m[pos];j++){
            if(cmp(temp,snow[pos][j])){//比較是否相同
                printf("Twin snowflakes found.\n");//找到相同的就直接輸出
                return 0;
            }
        }
        snow[pos][j] = temp;//如果之前不存在,那就加入到pos地址中去
        m[pos]++;//pos地址加1
    }
    printf("No two snowflakes are alike.\n");

    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章