zoukankan      html  css  js  c++  java
  • POJ 3349 Snowflake Snow Snowflakes (哈希表)

    题意:每片雪花有六瓣,给出n片雪花,六瓣花瓣的长度按顺时针或逆时针给出,判断其中有没有相同的雪花(六瓣花瓣的长度相同)

    思路:如果直接遍历会超时,我试过。这里要用哈希表,哈希表的关键码key用六瓣花瓣的长度的和取余一个数得到,表中为雪花的存储位置address(即在snowflakes数组中的位置)

    代码:

    #include<iostream>
    #include<vector>
    using namespace std;
    const int maxn=100000+100;//雪花最多数目
    const int mo=98765;//哈希取余的数
    int snowflakes[maxn][6];//存储雪花信息
    vector<int>hash[mo];//哈希表
    
    bool issame(int a,int b)
    {
    	for(int j=0;j<6;j++)  
    	{  
    		if(/*顺时针方向*/  
    			(snowflakes[a][0] == snowflakes[b][j] &&  
    			snowflakes[a][1] == snowflakes[b][(j+1)%6] &&  
    			snowflakes[a][2] == snowflakes[b][(j+2)%6] &&  
    			snowflakes[a][3] == snowflakes[b][(j+3)%6] &&  
    			snowflakes[a][4] == snowflakes[b][(j+4)%6] &&  
    			snowflakes[a][5] == snowflakes[b][(j+5)%6])  
    			
    			||  
    			/*逆时针方向*/  
    			(snowflakes[a][0] == snowflakes[b][j] &&  
    			snowflakes[a][1] == snowflakes[b][(j+5)%6] &&  
    			snowflakes[a][2] == snowflakes[b][(j+4)%6] &&  
    			snowflakes[a][3] == snowflakes[b][(j+3)%6] &&  
    			snowflakes[a][4] == snowflakes[b][(j+2)%6] &&  
    			snowflakes[a][5] == snowflakes[b][(j+1)%6])  
    			)  
    			return true;
    	}
    	return false;
    }
    int main()
    {
    	int n;
    	bool exist=false;
    	while(scanf("%d",&n)!=EOF)
    	{
    		int i,j,k;
    		for(i=0;i<n;i++)
    			for(j=0;j<6;j++)
    				scanf("%d",&snowflakes[i][j]);
    			int sum,key;
    			for(i=0;i<n;i++)
    			{
    				sum=0;
    				for(j=0;j<6;j++)
    					sum+=snowflakes[i][j];
    				key=sum%mo;//作为哈希表的key
    				vector<int>::iterator it;
    				for(it=hash[key].begin();it!=hash[key].end();it++)//遍历哈希表中key相同的雪花
    					if(issame(*it,i))
    					{
    						exist=true;
    						break;
    					}
    					hash[key].push_back(i);
    			}	
    			if(exist)
    				printf("Twin snowflakes found.
    ");
    			else
    				printf("No two snowflakes are alike.
    ");
    	}
    	return 0;
    }


  • 相关阅读:
    多态性的理解
    类(三)——继承与多态
    类(二)——拷贝控制(浅拷贝,深拷贝,浅赋值,深赋值)
    类 (一) ——基本概念
    STL容器底层数据结构的实现
    异常处理
    C++实现单例模式
    类的成员函数的连续调用与返回值问题
    拷贝构造函数的参数为什么必须使用引用类型?拷贝赋值运算符的参数为什么也是引用类型?
    U盘装机教程
  • 原文地址:https://www.cnblogs.com/gongpixin/p/4477416.html
Copyright © 2011-2022 走看看