poj 3349 Snowflake Snow Snowflakes

用了三种算法:

第一种算法:

相当暴力,用map保存所有可能得雪花,果断TLE。

第二种算法:

HASH, 采用拉链法处理冲突,数据结构静态链表,

hash方法为雪花六个点和,相邻点之差。AC

第三种算法:

HASH,sum为各雪花异或再加上相邻点之差。
再根据sum从小到大排序。AC

第二种算法代码:

View Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
using namespace std;

#define MAXN 1440000
#define MOD 1000003
bool flag;
//保存雪花数据结构
struct pnode
{
  int dis[10];
  int sum;
  //比较两雪花是否相等
  bool operator == ( const pnode & p) const
  {
     int x1 = 0, y1 = 0, x2 = 0, y2 = 0, x3 = 0, y3 = 0;
     for( int i = 0; i < 6; i++)
     {
       x1 += abs(dis[i] - dis[(i+1) % 6]);
       y1 += abs(p.dis[i] - p.dis[(i+1) % 6]);
     }
     if( x1 != y1 )
    return false;
     for( int i = 0; i < 6; i++)
     {
       x2 += abs(dis[i] - dis[(i+2) % 6]);
       y2 += abs(p.dis[i] - p.dis[(i+2) % 6]);
     }
     if( x2 != y2 )
     return false;
     for( int i = 0; i < 6; i++)
     {
       x3 += abs(dis[i] - dis[(i+3) % 6]);
       y3 += abs(p.dis[i] - p.dis[(i+3) % 6]);
     }
     if( x3 != y3 )
     return false;
     return true;
  }
}tx[MAXN];

//处理冲突静态链表;
struct node
{
  pnode data;
  int next;
}node[MAXN];


int head[MAXN], size;

//初始化
void init( )
{
  memset(head, -1, sizeof(head));
  size = 0;
  flag = true;
}

//得到key直
int get_key( pnode &st )
{ 
  st.sum = 0;
  for( int i = 0; i < 6; i++)
  {
     st.sum += st.dis[i];
     st.sum += abs(st.dis[(i+1) % 6] - st.dis[i]);
  }
  st.sum %= MOD;
  return st.sum; 
}

//判断是否冲突
int jugde( pnode &st)
{
  int key = get_key( st );
  for( int x = head[key]; x != -1; x = node[x].next )
  {
     if( st == node[x].data )
     {
        return false;
     }
  }
  node[size].data = st;
  node[size].next = head[key];
  head[key] = size++;
  return true;
}

int main( )
{
   int N;
   while( scanf("%d", &N) != EOF)
   {
      init( );
      for( int i = 0; i < N; i++)
      { 
         for( int j = 0; j < 6; j++)
         scanf("%d",&tx[i].dis[j]);
         if( flag ) 
            flag = jugde( tx[i] );
      }
      if( flag )
    puts("No two snowflakes are alike.");
      else
        puts("Twin snowflakes found.");
   }    
   return 0;
}

第三种算法代码:

View Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;

#define MAXN 1440000
#define MOD 1000003
bool flag;
int N;
//保存雪花数据结构
struct pnode
{
  int dis[10];
  int sum;
  
  bool operator < ( const pnode &p ) const 
  {
    return sum < p.sum;

  }
  //比较两雪花是否相等
  bool operator == ( const pnode & p) const
  {
     int x1 = 0, y1 = 0, x2 = 0, y2 = 0, x3 = 0, y3 = 0;
     for( int i = 0; i < 6; i++)
     {
       x1 += abs(dis[i] - dis[(i+1) % 6]);
       y1 += abs(p.dis[i] - p.dis[(i+1) % 6]);
     }
     if( x1 != y1 )
    return false;
     for( int i = 0; i < 6; i++)
     {
       x2 += abs(dis[i] - dis[(i+2) % 6]);
       y2 += abs(p.dis[i] - p.dis[(i+2) % 6]);
     }
     if( x2 != y2 )
     return false;
     for( int i = 0; i < 6; i++)
     {
       x3 += abs(dis[i] - dis[(i+3) % 6]);
       y3 += abs(p.dis[i] - p.dis[(i+3) % 6]);
     }
     if( x3 != y3 )
     return false;
     return true;
  }
}tx[MAXN];


//判断是否冲突
void jugde( )
{
  sort( tx, tx + N);
  for( int i = 0; i < N - 1; i++)
  {     
     if( tx[i+1].sum == tx[i].sum )
     {
         if( tx[i+1] == tx[i] )
         {
             flag = false;
             return;

         } 

     }
  
  }   
}

int main( )
{
   while( scanf("%d", &N) != EOF)
   {  
      flag = true;
      for( int i = 0; i < N; i++)
      {  
         tx[i].sum = 0;
         for( int j = 0; j < 6; j++)
         {
           scanf("%d",&tx[i].dis[j]);
           tx[i].sum ^= tx[i].dis[j];
         }
         for( int j  = 0; j < 6; j++)
         {
           tx[i].sum += abs(tx[i].dis[j] - tx[i].dis[(j+1) % 6] );
         }
      }
      jugde( );
      if( flag )
    puts("No two snowflakes are alike.");
      else
        puts("Twin snowflakes found.");
   }    
   return 0;
}

 

posted on 2012-07-18 11:12  more think, more gains  阅读(136)  评论(0编辑  收藏  举报

导航