POJ 3349 Snowflake Snow Snowflakes(哈希)

http://poj.org/problem?id=3349

题意 :分别给你n片雪花的六个角的长度,让你比较一下这n个雪花有没有相同的。

思路:一开始以为把每一个雪花的六个角的长度sort一下,然后再跟别的比,可实际上不是这样的,两个雪花相同的时候,角的顺序是固定的,可以是逆时针的也可以是顺时针的,因为雪花可以转动嘛,例如213456 和216543就是不一样的,这个题本身分类就是哈希,但是看到讨论里有人用暴力过的,,,我很是佩服,我压根就没往那个方面想,也许分类是哈希,我就认定哈希了吧,思维太固定了。

#include <iostream>

#include <stdio.h>

#include <string.h>

#include <vector>



using namespace std;

const int maxx = 100100 ;

int snow[maxx][6] ;

const int len = 90001 ;

vector <int >hash[len] ;



bool judge(int a, int b)

{

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

    {

        if( (snow[a][0] == snow[b][i] && snow[a][1] == snow[b][(i+1)%6] && snow[a][2] == snow[b][(i+2)%6] && snow[a][3] == snow[b][(i+3)%6] &&

            snow[a][4] == snow[b][(i+4)%6] && snow[a][5] == snow[b][(i+5)%6]) ||

            (snow[a][0] == snow[b][i] && snow[a][1] == snow[b][(i+5)%6] && snow[a][2] == snow[b][(i+4)%6] && snow[a][3] == snow[b][(i+3)%6] &&

            snow[a][4] == snow[b][(i+2)%6] && snow[a][5] == snow[b][(i+1)%6] ) )

            return true;

    }

    return false;

}



int main()

{

    int n ;

    scanf("%d",&n) ;

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

    {

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

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

    }

    int sum, key ;

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

    {

        sum = 0 ;

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

        {

            sum += snow[i][j] ;

        }

        key = sum % len ;

        for(vector<int>::size_type j = 0; j < hash[key].size(); j++)

        {

            if(judge(hash[key][j], i))

            {

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

               return 0;

            }

        }

        hash[key].push_back(i);

    }

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

    return 0;

}
View Code

 

你可能感兴趣的:(poj)