POJ 3349 Snowflake Snow Snowflakes

本文介绍了一种通过哈希函数和循环同构判断来检测两组六位数字是否构成相同雪花图案的方法。首先对数字求和并使用哈希函数处理,然后通过枚举检查两组数字是否循环同构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Snowflake Snow Snowflakes



哈希。首先是哈希函数的选择,先将每组的六个数字进行求和,然后对一个较大的素数取模。在就是判同构的问题,给定两个数字
串,判定是不是循环同构的。因为本题中只有六个,所以我们直接枚举就可以了。

#include <cstdio>
#include <cstring>
#include <vector>

#define maxn 100005
#define mod  10001
int N ;
int num[maxn][6] ;
std::vector<int> v[mod] ;

inline int hash(int x){
	return x%mod ;
}

bool judge(int x , int y){
	for(int i = 0 ; i < 6 ; i ++){
        if(num[x][0] == num[y][i] &&
           num[x][1] == num[y][(i+1)%6] &&
           num[x][2] == num[y][(i+2)%6] &&
           num[x][3] == num[y][(i+3)%6] &&
           num[x][4] == num[y][(i+4)%6] &&
           num[x][5] == num[y][(i+5)%6]
        )
            return 1 ;
        if(num[x][0] == num[y][i] &&
           num[x][1] == num[y][(i+5)%6] &&
           num[x][2] == num[y][(i+4)%6] &&
           num[x][3] == num[y][(i+3)%6] &&
           num[x][4] == num[y][(i+2)%6] &&
           num[x][5] == num[y][(i+1)%6]
        )
        return 1 ;
	}
	return 0 ;
}

bool check(int x , int y){
	for(int i = 0 ; i < v[x].size() ; i ++){
		if( judge(v[x][i] , y) )
			return 1 ;
	}
	return 0 ;
}

int main(){

	scanf("%d" , &N) ;
	int sum ;
	bool flag ;
	flag = 0  ;
	for(int k = 0 ; k < N ; k ++){
		scanf("%d%d%d%d%d%d" , &num[k][0] , &num[k][1] , &num[k][2] , &num[k][3] , &num[k][4] , &num[k][5] ) ;
		sum = num[k][0] + num[k][1] + num[k][2] + num[k][3] + num[k][4] + num[k][5] ;
		sum = hash(sum) ;
		flag = check(sum , k) ;
		if(flag)
			break ;
		v[sum].push_back(k) ;
	}

	if(flag)
        printf("Twin snowflakes found.\n") ;
	else
		printf("No two snowflakes are alike.\n") ;

	return 0 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值