天天看點

poj3349~差點逾時的哈希表

poj3349~差點逾時的哈希表
#include<iostream>
#include<string>
#define M  99999 
using namespace std;

struct snow
{
  int v;
  int flake[6];
  struct snow *next;
};
struct snow *s[M];
int vis[M];
int ok;

int hash(int f[])
{
  int sum=0;
  for(int i=0;i<6;i++)
    sum+=f[i];
  return sum%M;
}

int jude(int f1[],int f2[])
{
  int i,j,m,k;
  for(i=0;i<6;i++)
  {
    if(f2[0]==f1[i])
    {
      for(k=0,m=1,j=i+1;j<=i+5;j++,m++)
        if(f2[m]!=f1[j%6])
          break;
      if(m==6) return 1;

      for(k=0,m=1,j=i-1;j>=i-5;j--,m++)
        if(f2[m]!=f1[(j+6)%6])
          break;
      if(m==6) return 1;
    }
  }
  return 0;
}

void insert(struct snow *ss,int f[])
{
  while(ok==0)
  {
    if(ss->v==0)
    {
      ss->v=1;
      ss->next=new struct snow;
      for(int i=0;i<6;i++)
        ss->flake[i]=f[i];
      ss->next->v=0;
      ss->next->next=NULL;
      break;
    }
    else
    {
      if(jude(ss->flake,f))
        ok=1;

      ss=ss->next;
    }
  }

}


int main()
{
  int n,i,j,f[6],h;
  memset(vis,0,sizeof(vis));
  scanf("%d",&n);
  ok=0;
  for(i=0;i<n;i++)
  {
    for(j=0;j<6;j++)
      scanf("%d",&f[j]);
    
    if(ok==0)
    {
      h=hash(f);
      if(vis[h]==0)
      {
        vis[h]=1;
        s[h]=new struct snow;
        s[h]->v=0;
        s[h]->next=NULL;
      }
      insert(s[h],f);
    }
  }
  if(ok)
    printf("Twin snowflakes found.\n");
  else 
    printf("No two snowflakes are alike.\n");
  return 0;
}