现在的位置: 首页 > 综合 > 正文

nyoj 130 相同的雪花

2013年10月17日 ⁄ 综合 ⁄ 共 980字 ⁄ 字号 评论关闭

题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=130

题意:一个雪花有六个角,每个角对应一个值,给出N个雪花,问能不能是否存在两片相同的雪花(给出的角可能是逆序的);

解题思路:由于有很多雪花,因此数据很大,如果单纯的进行直接查询的话肯定会TE,因此可以用哈希的方法,其中哈希函数可以用每个雪花的各个角的和来定义;然后映射到相应的位置。一旦找到就不在进行哈希。

 
#include<iostream>
#include<cstdio>
using namespace std;
struct snow
{
	int a[6];
	struct snow *next;
};
snow *s[100005];
bool fun(int b[],int sum)
{
	snow *p;p=s[sum]->next;
	while(p)
	{
		for(int i=0;i<6;i++)
		{
			if(b[i]==p->a[0])
			{
				int j;
				for(j=1;j<6;j++)
				{
					if(b[(i+j)%6]!=p->a[j])break;
				}
				if(j==6)return true;
				for(j=1;j<6;j++)
				{
					if(b[((i-j)%6+6)%6]!=p->a[j])break;
				}
				if(j==6)return true;
			}
		}
		p=p->next;
	}
	p=new snow;
	for(int i=0;i<6;i++)
	{
		p->a[i]=b[i];
	}
	p->next=s[sum]->next;
	s[sum]->next=p;
	return false;
}
int main()
{
	int n;cin>>n;
	while(n--)
	{
		int m;cin>>m;
		for(int i=0;i<100000;i++)
		{
			s[i]=new snow;s[i]->next=NULL;
		}
		int flat=1;
		for(int i=0;i<m;i++)
		{
			int b[6];int sum=0;
			for(int j=0;j<6;j++)
			{
				scanf("%d",&b[j]);sum+=b[j];
			}
			sum%=100000;
			if(flat)
			{
				if(fun(b,sum)) flat=0;
			}
		}
		if(!flat)printf("Twin snowflakes found.\n");
		else printf("No two snowflakes are alike.\n");
	}
}
        

 

抱歉!评论已关闭.