题意:判断有没有两朵相同的雪花。每朵雪花有六瓣,比较花瓣长度的方法看是否是一样的,如果对应的arms有相同的长度说明是一样的。给出n朵,只要有两朵是一样的就输出有Twin snowflakes found.,如果任何两个都是不一样的输出No two snowflakes are alike。n=100,000。

思路:最简单的就是枚举每两片雪花,判断他们是否相同。时间复杂度为O(n*n),显然效果不理想。有没有更好的算法呢?hash:每读进一片雪花,将雪花hash,判断hash表里是否有相同的hash值,有相同的hash值,从链表中一一取出并判断是否同构,是同构得出结果。然后将该雪花加入到表中,所有雪花读完也没有发现相同的,则得出结果。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <iostream>
using namespace std; const int MAX_SIZE = 100005; //最大的雪花数
const int MOD_VAL = 90001; //hash函数,取余的数 int snow[MAX_SIZE][6]; //存储雪花信息
vector<int> hash[MOD_VAL]; //hash表,表中存储的是snow数组的下标 /*判断雪花a与雪花b是否同样
*输入:两个雪花在snow数组的下标
*输出:true or false
*/
bool isSame(int a, int b)
{
for(int i=0;i<6;i++)
{
if(/*顺时针方向*/
(snow[a][0] == snow[b][i] &&
snow[a][1] == snow[b][(i+1)%6] &&
snow[a][2] == snow[b][(i+2)%6] &&
snow[a][3] == snow[b][(i+3)%6] &&
snow[a][4] == snow[b][(i+4)%6] &&
snow[a][5] == snow[b][(i+5)%6]) ||
/*逆时针方向*/
(snow[a][0] == snow[b][i] &&
snow[a][1] == snow[b][(i+5)%6] &&
snow[a][2] == snow[b][(i+4)%6] &&
snow[a][3] == snow[b][(i+3)%6] &&
snow[a][4] == snow[b][(i+2)%6] &&
snow[a][5] == snow[b][(i+1)%6])
) return true;
} return false;
} int main()
{
/*处理输入*/
int n;
int i,j;
scanf("%d", &n);
for( i = 0; i < n; i++)
{
for( j = 0; j < 6; j++)
{
scanf("%d", &snow[i][j]);
}
} /*分别处理这n个雪花,判断有没两个雪花是相同的*/
int sum, key;
for(i = 0; i < n; i++)
{
/*求出雪花六个花瓣的和*/
sum = 0;
for( j = 0; j < 6; j++)
{
sum += snow[i][j];
} key = sum % MOD_VAL; //求出key /*判断在hash表中hash[key]存储的雪花是否与雪花i相同*/
for(vector<int>::size_type j = 0; j < hash[key].size(); j++)
{
/*若相同,则直接输出,并结束程序*/
if(isSame(hash[key][j], i))
{
printf("%s/n", "Twin snowflakes found.");
exit(0);
}
}
/*若key相同的雪花没有一个与雪花i相同*/
hash[key].push_back(i);
} /*若都不相同*/
printf("%s/n", "No two snowflakes are alike."); return 0;
}

POJ 3349 Snowflake Snow Snowflakes(哈希表)的更多相关文章

  1. 哈希—— POJ 3349 Snowflake Snow Snowflakes

    相应POJ题目:点击打开链接 Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions ...

  2. POJ 3349 Snowflake Snow Snowflakes(简单哈希)

    Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 39324   Accep ...

  3. poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)

    Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30529   Accep ...

  4. [ACM] POJ 3349 Snowflake Snow Snowflakes(哈希查找,链式解决冲突)

    Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30512   Accep ...

  5. POJ 3349 Snowflake Snow Snowflakes

    Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 27598 Accepted: ...

  6. POJ 3349 Snowflake Snow Snowflakes (Hash)

    Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 48646   Accep ...

  7. POJ 3349 Snowflake Snow Snowflakes (哈希表)

    题意:每片雪花有六瓣,给出n片雪花,六瓣花瓣的长度按顺时针或逆时针给出,判断其中有没有相同的雪花(六瓣花瓣的长度相同) 思路:如果直接遍历会超时,我试过.这里要用哈希表,哈希表的关键码key用六瓣花瓣 ...

  8. POJ - 3349 Snowflake Snow Snowflakes (哈希)

    题意:给定n(0 < n ≤ 100000)个雪花,每个雪花有6个花瓣(花瓣具有一定的长度),问是否存在两个相同的雪花.若两个雪花以某个花瓣为起点顺时针或逆时针各花瓣长度依次相同,则认为两花瓣相 ...

  9. poj3349 Snowflake Snow Snowflakes —— 哈希表

    题目链接:http://poj.org/problem?id=3349 题意:雪花有6个瓣,有n个雪花,输入每个雪花的瓣长,判断是否有一模一样的雪花(通过旋转或翻转最终一样,即瓣长对应相等).如果前面 ...

随机推荐

  1. Win7 64bit+Anaconda(3-5.0.1,Python3.6)+Pycharm(community-2017.3.3)+OpenCV(python‑3.4.0‑cp36‑cp36m)(转载)

    Anaconda(3-5.0.1,Python3.6)下载链接:https://pan.baidu.com/s/1bqFwLMB 密码:37ih Pycharm(community-2017.3.3) ...

  2. LeetCode78:Subsets

    Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must ...

  3. Python调用API接口的几种方式 数据库 脚本

    Python调用API接口的几种方式 2018-01-08 gaoeb97nd... 转自 one_day_day... 修改 微信分享: 相信做过自动化运维的同学都用过API接口来完成某些动作.AP ...

  4. RecyclerView加载更多用notifyDataSetChanged()刷新图片闪烁

    首先来看看对比ListView看一下RecyclerView的Adapter主要增加了哪些方法: notifyItemChanged(int position) 更新列表position位置上的数据可 ...

  5. CLR内存回收总结,代龄机制

    关键字:对象可达图,代龄机制,终止化对象. 代龄机制: 0代满了之后,GC开始回收,剩下的对象升级为1代.(只有不可达的对象才会被回收.) 0代再回收几次之后,1代的对象慢慢增多然后达到阈值,GC同时 ...

  6. Hadoop环境搭建1_JDK+SSH

    1 前言: Hadoop 最早是为了在Linux 平台上使用而开发的,但是Hadoop 在UNIX.Windows 和Mac OS X 系统上也运行良好.不过,在Windows 上运行Hadoop 稍 ...

  7. java 经典范例

    使用for 循环输出空心菱形 package 开阳; import java.util.Scanner; public class image { public static void main(St ...

  8. 移动端实用的meta标签

    直接上代码,代码自有颜如玉 代码自有黄金屋啊 <meta http-equiv="Content-Type" content="text/html; charset ...

  9. jar -cmf file1 file2 file3命令

    jar -cmf file1 file2 file3中的参数c.m.f和file1.file2.file3是一一对应的. 也就是说,file1是输出的.jar文件,file2是往META-INF/MA ...

  10. iOS 符号化崩溃日志

    1.获取一下三个文件   1. crash报告(.crash文件) 2. 符号文件 (.dsymb文件) 3. 应用程序文件 (appName.app文件,把IPA文件后缀改为zip,然后解压,Pay ...