POJ 3349 Snowflake Snow Snowflakes

判断n朵雪花中,是否有完全一样的雪花。一道比较简单的hash,我们将雪花的六个边的权值加

起来,记为sum,将sum相等的雪花归为一类,再在这里面根据题意找完全相同的,在同类中找到

一个角相同的,然后判断顺时针或者逆时针的所有角是否一模一样。

/*Accepted    3828K    3204MS    C++    1675B    2012-08-24 10:44:15*/

#include<stdio.h>

#include<stdlib.h>

#include<vector>

using namespace std;



const int prime = 19999;

const int MAXN = 100100;

int sf[MAXN][6];

vector<int> hash[20000];



void HASH(int i, int sum)

{

    int j, key;

    key = sum % prime;

    hash[key].push_back(i);

}



bool cmp(int x, int y)

{

    bool flag = false;

    int i, j;

    for(i = 0; i < 6; i ++)

    {

        if(sf[x][0] == sf[y][i])

        {

            for(j = 1; j < 6; j ++)

            {

                if(sf[x][j] != sf[y][(i + j) % 6])

                    break;

            }

            if(j == 6) flag = true;



            for(j = 1; j < 6; j ++)

            {

                if(sf[x][6 - j] != sf[y][(i + j) % 6])

                    break;

            }

            if(j == 6) flag = true;

        }

    }

    return flag;

}



bool check()

{

    int i, j, k;

    for(i = 0; i < 20000; i ++)

    {

        for(j = 0; j < hash[i].size(); j ++)

        {

            for(k = j + 1; k < hash[i].size(); k ++)

            {

                if(cmp(hash[i][j], hash[i][k]))

                    return true;

            }

        }

    }

    return false;

}



int main()

{

    int n, i, j, sum;

    while(scanf("%d", &n) == 1)

    {

        for(i = 0; i < n; i ++)

        {

            sum = 0;

            for(j = 0; j < 6; j ++)

            {

                scanf("%d", &sf[i][j]);

                sum += sf[i][j];

            }

            HASH(i, sum);

        }

        if(check())

            printf("Twin snowflakes found.\n");

        else

            printf("No two snowflakes are alike.\n");

    }

    return 0;

}

 

 

你可能感兴趣的:(poj)