1. 程式人生 > >Snowflake Snow Snowflakes哈希

Snowflake Snow Snowflakes哈希

htable include 哈希 back pac 兩個 true scanf 逆時針

題意是每個雪花有六個臂,每個臂有一個值,如果兩個雪花的臂順時針或者逆時針相等,那麽這兩個雪花相等

給你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; }

Snowflake Snow Snowflakes哈希