poj 3349

本文介绍了一种用于识别和匹配雪花图案的独特算法。该算法通过旋转和镜像操作来比较雪花的相似性,并利用哈希表进行高效存储和查找。通过读取文件输入,程序能够判断是否有完全相同的雪花图案出现。

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

#include<iostream>
#include<fstream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;

const int PRIME=999983;
int clockwise[12];
int countclockwise[12];
class Node
{
	public:

		int arms[6];
		Node *next;
		bool operator ==(Node p)  //比较两个雪花是否相同
		{
			for(int i=0;i<6;i++)
			{
				clockwise[i+6]=clockwise[i]=p.arms[i];
				countclockwise[i+6]=countclockwise[i]=p.arms[5-i];
			}
			for(int i=0;i<7;i++)
			{
				int j;
				for(j=0;j<6;j++)
				{
					if(arms[j]!=clockwise[i+j])
						break;
				}
				if(j==6)
					return true;
			}
			for(int i=0;i<7;i++)
			{
				int j;
				for(j=0;j<6;j++)
				{
					if(arms[j]!=countclockwise[i+j])
						break;
				}
				if(j==6)
					return true;
			}


			return false;
		}
		Node(const int *input)
		{
			for(int i=0;i<6;i++)
			{
				arms[i]=input[i];
			}
			next=NULL;
		}
};
Node *HashTable[PRIME+1]={};

bool find(int *input)
{
	int key=0;
	for(int i=0;i<6;i++)
	{
		key+=input[i];
	}
	key=key%PRIME+1;
	Node *p=HashTable[key];
	Node* temp=new Node(input);
	if(p==NULL)
	{
		HashTable[key]=temp;
		return false;
	}
	while(p->next!=NULL)
	{
		if(*p==*temp)
			return true;
		p=p->next;
	}
	if(*p==*temp)
		return true;
	p->next=temp;
	return false;
}
int main()
{
	freopen("input.txt","r",stdin);
	int n;
	bool flag;
	int input[6];
	scanf("%d",&n);

	memset(HashTable,0,sizeof(Node *)*(PRIME+1));
	flag=false;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<6;j++)
			scanf("%d",&input[j]);
		if(flag==false)
		{
			flag=find(input);
		}
	}
	if(flag)
		printf("Twin snowflakes found.\n");
	else
		printf("No two snowflakes are alike.");



}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值