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;
    }


  • 相关阅读:
    【MySQL笔记】字符串、时间日期转换
    【MySQL笔记】触发器,存储过程和函数
    【MySQL笔记】用户管理
    spray 处理 response 的通用函数
    akka pubsub example
    一个手写的 http client
    scala get ipv4 address
    akka cluster singleton
    akka cluster sharding
    akka cluster 初体验
  • 原文地址:https://www.cnblogs.com/gongpixin/p/4477416.html
Copyright © 2011-2022 走看看