poj 3349 Snowflake Snow Snowflakes

题意:给你n个堆数据,每堆有六个数,堆与堆之间要顺时针或逆时针相等,问是否有两堆相等

哈希直接算了。


#include <iostream>
#include <cstdio>
#include<cstring>
using namespace std;
#define N  1200010
struct node{
	int num[6];
	int next;
}p[N];
int cur ,hashTable[N];
void initHash(){
	cur=0;
	memset(hashTable,-1,sizeof(hashTable));
} 
int getHash(int *num){
	int hash=0;
	for(int i=0;i<6;i++)
		hash+=num[i];
	return hash%N;
}
bool cmp(int *num1,int *num2){
	for(int i=0;i<6;i++)
		if(num1[i]!=num2[i])
			return false;
	return true;
}
void insertHash(int *num,int h){
	for(int i=0;i<6;i++)
		p[cur].num[i]=num[i];
		
	p[cur].next=hashTable[h];
	hashTable[h]=cur;
	++cur;
}
bool SearchHash(int *num){
	int h=getHash(num);
	int next=hashTable[h];
	while(next!=-1){
		if(cmp(num,p[next].num))
			return true;
		next=p[next].next;
	}
	insertHash(num,h);
	return false;
}
int main(int argc, char** argv) {
	int num[2][12],n;
    bool flag=0;
	initHash();
	scanf("%d",&n);
	while(n--){
		for(int i=0;i<6;i++){
			scanf("%d",&num[0][i]);
			num[0][i+6]=num[0][i];
		}
		if(flag)
			continue;
		for(int i=0;i<6;i++){
			num[1][i+6]=num[1][i]=num[0][5-i];
		}
		for(int i=0;i<6;i++){
			if(SearchHash(num[0]+i)||SearchHash(num[1]+i)){
				flag=1;
				break;
			}
		}
	}	
	if(!flag)
		puts("No two snowflakes are alike.");
	else
		puts("Twin snowflakes found.");
	return 0;
}


你可能感兴趣的:(poj)