poj解题报告——3349

来源:互联网 发布:武汉有单片机培训机构 编辑:程序博客网 时间:2024/04/28 05:51

        2月1日第一题,也是我寒假第一题。

        这题分类是用哈希表做,一开始我都不知道什么是哈希表,摸索了许久,参考了别人的代码,写下了这个。

        题意:每个雪花都有六个分支,用六个整数代表,这六个整数是从任意一个分支开始,朝顺时针或逆时针方向遍历得到的。输入多个雪花,判断是否有形状一致的雪花存在。简单的数字哈希,每种雪花可以由多种数字组合表示。例如输入的是1 2 3 4 5 6,则2 3 4 5 6 1,3 4  5 6 1 2,……,6 5 4 3 2 1,5 4 3 2 1 6等都是相同形状的。因此可以在读入一个雪花的时候把这些情况全部放入哈希表中,如果某次插入的时候发生冲突,则说明存在重复的雪花,并且后面的不需要再处理。

代码如下

#include <stdio.h>
#define N 1200010
#define H 1200007
struct Node
{
    int num[6];
    int next;
};
struct Node node[N];
int cur;
int hashTable[H];
void initHash()
{
    int i;
    cur=0;
    for(i=0;i<H;i++)
        hashTable[i]=-1;
}
unsigned int getHash(int *num)
{
    unsigned int hash=0;
    int i;
    for(i=0;i<6;i++)
    {
        hash+=num[i];
    }
    return hash%H;
}

int cmp(int *num1, int *num2)
{
    int i;
    for(i=0;i<6;i++)
    {
        if(num1[i]!=num2[i])
            return 0;
    }
    return 1;
}
void insertHash(int *num,unsigned int h)
{
    int i;
    for(i=0; i<6;i++)
        node[cur].num[i] = num[i];
    node[cur].next=hashTable[h];
    hashTable[h]=cur;
    ++cur;
}

int searchHash(int* num)
{
    unsigned h=getHash(num);
    int next=hashTable[h];
    while(next!=-1)
    {
        if(cmp(num,node[next].num))
            return 1;
        next=node[next].next;
    }
    insertHash(num,h);
    return 0;
}
void main()
{
    int num[2][12];
    int n,i;
    int twin=0;
    initHash();
    scanf("%d",&n);
    while(n--)
    {
        for(i=0;i<6;i++)
        {
            scanf("%d",&num[0][i]);
            num[0][i+6]=num[0][i];
        }
        if(twin)
            continue;
        for(i=0;i<6;i++)
        {
            num[1][i+6]=num[1][i]=num[0][5-i];
        }
        for(i=0;i<6;i++)
        {
            if(searchHash(num[0]+i)||searchHash(num[1]+i))
            {
                twin=1;
                break;
            }
        }
    }
    if(twin)
        printf("Twin snowflakes found.\n");
    else
        printf("No two snowflakes are alike.\n");
}

0 0
原创粉丝点击