zoukankan      html  css  js  c++  java
  • POJ 3349

    本题哈希,但judge的时间还是很长,哎;

    #include <stdio.h>
    #include <memory.h>
    #define maxn 100003
    struct s{
    	int arms[6];
    	int amount;
    }snow[maxn];
    int head[maxn],next[maxn];//maxn大小的哈希表
    int judge(int *a,int *b)
    {
    	int i,j,ok=1,t=0;
    	int k[6];
    	for(i=0;i<6&&ok;i++)
    	{
    		for(j=0;j<6;j++)
    		{
    			if(a[i]==b[j])
    			{
    				ok=0;
    				k[t++]=j;
    			}
    		}
    	}
    	if(t==0) return 0;
    	for(;t>=0;t--){
    	for(i=1;i<6;i++)//顺时针
    	{
    		if(a[i]!=b[(i+k[t])%6]) break;
    	}
    	if(i==6) return 1;
    	for(i=1;i<6;i++)//逆时针
    	{
    		if(a[i]!=b[(k[t]-i+6)%6]) break;
    	}
    	if(i==6) return 1;
    	}
    	return 0;
    
    }
    int insert(int i)
    {
    	int loc=(snow[i].amount)%maxn;//哈希函数
    	int u=head[loc];
    
    	while(u!=-1)
    	{
    		if((snow[u].amount==snow[i].amount)&&judge(snow[u].arms,snow[i].arms)) return 1;
    		u=next[u];
    	}
        next[i]=head[loc];
    	head[loc]=i;
    	return 0;
    }
    int main()
    {
    	int n;
    	while(scanf("%d",&n)!=EOF){
    		int flag=0;
    		memset(head,-1,sizeof(head));
    		int i,j;
    		for(i=0;i<n;i++)
    		{
    			snow[i].amount=0;
    			for(j=0;j<6;j++)
    			{
    				scanf("%d",&snow[i].arms[j]);
    
    				snow[i].amount=snow[i].amount+snow[i].arms[j];//key关键字
    			}
    			if(insert(i)) flag=1;
    		}
    		if(flag) printf("Twin snowflakes found.\n");
    		else printf("No two snowflakes are alike.\n");
    	}
    	return 0;
    }
    


     

  • 相关阅读:
    右键点击属性截图不了
    win7再分配磁盘新加卷
    oracle逻辑存储结构
    ORACLE spool打印
    oracle实例状态
    基于SCN增量恢复DG同步
    delete误删数据使用SCN恢复
    DG中模拟failover故障与恢复
    NFS挂载遇到的问题
    关于“身为父母”
  • 原文地址:https://www.cnblogs.com/lj030/p/3002327.html
Copyright © 2011-2022 走看看