Snowflake Snow Snowflakes哈希

题意是每个雪花有六个臂,每个臂有一个值,如果两个雪花的臂顺时针或者逆时针相等,那么这两个雪花相等

给你n个雪花,问你是否有两个雪花相等

#include<stdio.h>
#include<vector>
using namespace std;
const int maxn=100005;
int xue[maxn][12];
vector<int>hashtable[100005];
bool cmp1(int a,int b,int i,int j)
{
    for (int k=0; k<6 ; k++ )
    {
        if(xue[a][i+k]!=xue[b][j+k])
        {
            return false;
        }
    }
    return true;
}
bool cmp2(int a,int b,int i,int j)
{
    for (int k=0; k<6 ; k++ )
    {
        if(xue[a][i+k]!=xue[b][j+5-k])
        {
            return false;
        }
    }
    return true;
}
bool issame(int a,int b)
{
    for (int i=0; i<6 ; i++ )
    {
        for (int j=0; j<6 ; j++ )
        {
            if(cmp1(a,b,i,j)||cmp2(a,b,i,j))
            {
                return true;
            }
        }
    }
    return false;
}
int main()
{
    int n;
    scanf("%d",&n);
    int ok=0;
    for (int i=0; i<n ; i++ )
    {
        int sum=0;
        for (int j=0; j<6 ; j++ )
        {
            scanf("%d",&xue[i][j]);
            xue[i][j+6]=xue[i][j];
            sum+=xue[i][j];
        }
        sum%=maxn;
        if(!ok)
        {
            for (int j=0; j<hashtable[sum].size() ; j++ )
            {
                if(issame(hashtable[sum][j],i))
                {
                    ok=1;
                    break;
                }
            }
            hashtable[sum].push_back(i);
        }
    }
    if(ok)
    {
        printf("Twin snowflakes found.");
    }
    else
    {
        printf("No two snowflakes are alike.");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Json-Five/p/9792670.html