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


  • 相关阅读:
    股票投资
    知道复利终值求本金
    复利计算和单利计算
    实验0:了解和熟悉操作系统
    0909我的编译原理感
    递归下降分析法
    有(很)穷的自动机
    评论
    C语言文法阅读与理解序
    C语言文法阅读与理解
  • 原文地址:https://www.cnblogs.com/gongpixin/p/4477416.html
Copyright © 2011-2022 走看看