POJ 3349 Snowflake Snow Snowflakes hash

题意:每个雪花有六个角,每个角用一个数字表示。输入n个雪花,若存在两个雪花相等则输出Twin snowflakes found。否则输出No two snowflakes are alike.
题解:hash

#include <iostream>
#include <cstdlib>
using namespace std;

#define Prime 14997

struct ListNode
{
	int a[6];
	struct ListNode *next;
};
struct ListNode table[Prime];

bool isFindsame( int key, int *b )
{
	ListNode *p = table[key].next;
    int i, j, cnt, s;
	while( p != NULL )
	{
		for( s = 0; s < 6; ++s )  /*枚举比较的起点,一个始终0-5,另一个不断改变*/
		{
			for( i = cnt = 0, j = s; cnt < 6; ++i,++j ) //顺时针
			{
				if ( j > 5 ) j = j % 6;
				if( p->a[i] != b[j] ) break;
				else ++cnt;
			}
			if( cnt == 6 ) return true;  /*若六个角均相同,则返回true*/
			for( i = cnt = 0, j = s; cnt < 6; ++i, --j )  //逆时针
			{
				if ( j < 0 ) j = j + 6;
				if( p->a[i] != b[j] ) break;
				else ++cnt;
			}
			if( cnt == 6 ) return true;
		}
		p = p->next;
	}
	return false;
}

void Insert( int key, int *b )
{
   ListNode *p = new (ListNode);
   for ( int i = 0; i < 6; ++i )
	   p->a[i] = b[i];
   p->next = table[key].next;
   table[key].next = p;
}

int main()
{
	int b[6], n, HashVal, id, i, j;
	bool flag = false;
	memset(table,NULL,sizeof(table));
	scanf("%d",&n);
	for( i = 0; i < n && !flag; i++ )
	{
		for( j = HashVal = 0; j < 6; j++ )
		{
			scanf("%d",b+j);
			HashVal += b[j];
		}
		id = HashVal % Prime;
		if( isFindsame( id, b ) ) 
			flag = true;
		else Insert( id, b );
	}

	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、付费专栏及课程。

余额充值