码迷,mamicode.com
首页 > 其他好文 > 详细

POJ3349

时间:2017-01-03 15:01:12      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:win   als   ace   int   can   style   while   class   bool   

Hash table经典算法

以前写的算法, 用时1860ms

 

#include <iostream>
#include <string>

using namespace std;

#define HASHLEN 202099
#define SNOWNUM 100001

struct Node {
    int arms[6];
    int next;
};

Node snow[SNOWNUM];
int hashTable[HASHLEN];

bool cmp(int *armsx, int *armsy){
    int i, j;
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 6; j++) {
            if (armsx[j] != armsy[(i+j)%6])
                break;
        }
        if (j == 6) return true;
    }

    for (i = 0; i < 6; i++) {
        for (j = 0; j < 6; j++) {
            if (armsx[j] != armsy[(6+i-j)%6])
                break;
        }
        if (j == 6) return true;
    }

    return false;
}

int main()
{
    int n, cnt, hVal, idx, pre, i, j;

    scanf("%d",&n);

    memset(hashTable, 0x00, sizeof(hashTable));

    for (i = 1; i <= n; i++)
    {
        cnt = 0;
        //input data
        snow[i].next = 0;
        for (j = 0; j < 6; j++) {
            scanf("%d",&snow[i].arms[j]);
            cnt += snow[i].arms[j];
        }

        //calc hash key
        hVal = cnt % HASHLEN;

        //insert to hashtable
        idx = hashTable[hVal];
        if (idx > 0) {
            do {
                pre = idx;
                //Compare same snowflake
                if (cmp(snow[i].arms, snow[pre].arms)) {
                    cout << "Twin snowflakes found." << endl;
                    return 0;
                }
                idx = snow[idx].next;
            } while (idx > 0);
            snow[pre].next = i;
        } else {
            hashTable[hVal] = i;
        }
    }

    cout << "No two snowflakes are alike." << endl;

    return 0;
}

 

POJ3349

标签:win   als   ace   int   can   style   while   class   bool   

原文地址:http://www.cnblogs.com/hushpa/p/6244627.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!