poj 3349 Snowflake Snow Snowflakes
用了三种算法:
第一种算法:
相当暴力,用map保存所有可能得雪花,果断TLE。
第二种算法:
HASH, 采用拉链法处理冲突,数据结构静态链表,
hash方法为雪花六个点和,相邻点之差。AC
第三种算法:
HASH,sum为各雪花异或再加上相邻点之差。
再根据sum从小到大排序。AC
第二种算法代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }
第三种算法代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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) 编辑 收藏 举报