哈尔滨理工大学2016新生赛H题

陈月亮最喜欢的季节就是冬天了,这不看着窗外飘起了雪花,陈月亮开心的跑出屋来看雪。但是迷迷糊糊的陈月亮不知道自己是在做梦还是真的下起了雪。突然她想起了一句话,在真实世界中是没有两片一样的雪花的。于是你的任务就是比较这场雪中的所有雪花,如果出现了两朵完全一致的雪花,则证明陈月亮是在梦中。

每朵雪花用六个整数表示,范围在(1 – 10000000)之间,表示雪花六个花瓣的长度,六个整数的先后出现顺序可能是顺时针顺序也可能是逆时针顺序,并且可能是从任意一个花瓣开始的。比如说对同一个花瓣,描述方法可能是1 2 3 4 5 6 或者 4 3 2 1 6 5

Input

第一行为一个整数T,表示有T组测试数据。

每组测试数据第一行为一个整数N(0 < N <= 100000),表示雪花的数目。

接下来n行每行六个整数,描述一朵雪花。

Output

如果没有相同的雪花,输出“No two snowflakes are alike.”,否则输出“Twin snowflakes found.”

Sample Input

1

2

1 2 3 4 5 6

4 3 2 1 6 5

Sample Output

Twin snowflakes found.

每读入一片雪花,就将该雪花进行哈希操作,并判断哈希表里是否有相同的哈希值,如有相同的哈希值就从链表中一一取出并判断是否同构即可。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <stdlib.h>
 4 #include <vector>
 5 using namespace std;
 6
 7 const int M = 90001; //myhash函数,取余的数
 8
 9 int snow[100005][6]; //存储雪花信息
10 vector<int> myhash[M]; //myhash表,表中存储的是snow数组的下标
11
12 bool isSame(int a, int b)//判断a与b是否同样
13 {
14     for(int i=0;i<6;i++)
15     {
16         //顺时针
17         if((snow[a][0] == snow[b][i] &&
18                     snow[a][1] == snow[b][(i+1)%6] &&
19                     snow[a][2] == snow[b][(i+2)%6] &&
20                     snow[a][3] == snow[b][(i+3)%6] &&
21                     snow[a][4] == snow[b][(i+4)%6] &&
22                     snow[a][5] == snow[b][(i+5)%6])
23                 ||   //逆时针
24                 (snow[a][0] == snow[b][i] &&
25                  snow[a][1] == snow[b][(i+5)%6] &&
26                  snow[a][2] == snow[b][(i+4)%6] &&
27                  snow[a][3] == snow[b][(i+3)%6] &&
28                  snow[a][4] == snow[b][(i+2)%6] &&
29                  snow[a][5] == snow[b][(i+1)%6]))
30
31             return true;
32     }
33     return false;
34 }
35
36 int main()
37 {
38     freopen("h.out", "w", stdout);
39     int T;
40     cin >> T;
41     while (T--) {
42         int ok = 0;
43         int n;
44         int i,j;
45         cin>>n;
46         for( i = 0; i < n; i++)
47             for( j = 0; j < 6; j++)
48                 cin>>snow[i][j];
49
50         int sum, key;
51         for(i = 0; i < n; i++)
52         {
53             sum = 0;//求出雪花六个花瓣的和
54             for( j = 0; j < 6; j++)
55                 sum += snow[i][j];
56             key = sum % M; //求出key
57
58             //判断是否与myhash表中myhash[key]存储的雪花相同
59             for(vector<int>::size_type j = 0; j < myhash[key].size(); j++)
60             {
61                 if(isSame(myhash[key][j], i))//如相同
62                 {
63                     cout<<"Twin snowflakes found."<<endl;
64                     ok = 1;
65                     break;
66                 }
67             }
68             if (ok) {
69                 break;
70             }
71             myhash[key].push_back(i);//若没找到相同的
72         }
73         if (ok == 0)
74             cout<<"No two snowflakes are alike."<<endl;
75     }
76     return 0;
77 }
时间: 2024-11-03 22:51:52

哈尔滨理工大学2016新生赛H题的相关文章

哈尔滨理工大学2016新生赛D题

陈月亮从小就热爱数学,这天老师讲到任何一个正整数N,我们可以很容易的找出N的所有因子,N1,N2,N3...,Nk,称N一共有k个因子(包含1和N本身). 求出k的值这个问题对于陈月亮来说实在是太简单了,于是她想要求出N所有因子的因子个数(如N1可能包含n1个因子(包含1和N1本身),N2可能包含n2个因子,...,Nk可能包含nk个因子),然后计算出S的值: 第一行为一个整数T(T <= 10000),代表测试数据的组数. 接下来T行每行一个正整数N(N < 2 ^ 31). 对于每组测试数

哈尔滨理工大学2016新生赛A题

一名骑着马的强盗闯进了原本平静祥和的棋盘村,为了通知村里的士兵来打败强盗,你必须要通知位于棋盘村最下方的兵营.棋盘村的地形就像是一张棋盘,你所在的位置为A点(0,0),兵营位于棋盘村的右下角B点(n,m).你每次只能走一步,可以选择向下走,也可以选择向右走.但是强盗所在的位置和强盗的马一次所能跳到的位置是不可以走过去的(强盗的马的移动方法与象棋中的马相同).请计算出从A点能够走到B点的所有路径条数. 首先输入一个整数t,代表有t组测试数据. 每组测试数据为四个整数,即B点的坐标(n,m)和强盗的

哈尔滨理工大学2016新生赛F题

给出两个正整数m,n,在笛卡尔坐标系中选出四个不同的点,满足: (1)   点的横坐标是一个在区间[0,m]的整数. (2)   点的纵坐标是一个在区间[0,n]的整数. (3)   这四个点做顶点构成一个菱形. 有多少种满足以上条件的选择方法呢? Input 多组测试数据,每组输入两个正整数m,n(m <= 1000, n <= 1000). 处理到文件结束. Output 每行输出一个整数,表示有多少满足条件的选择方法. Sample Input 2 2 Sample Output 6 #

哈尔滨理工大学2016新生赛C题

一个r行c列的矩阵里的所有元素都为0或1,给出这个矩阵每一行的和以及每一列的和,那么是否存在这样一个矩阵满足条件呢,如果存在任意一个满足条件的矩阵则输出YES,如果不存在则输出NO? 每组测试数据第一行包含两个整数r,c,表示矩阵的行数和列数. 第二行包含r个32位无符号数,表示矩阵每行的和. 第三行包含c个32位无符号数,表示矩阵每列的和. (1 <= r,c <= 100000) 如果存在这样的一个01矩阵,输出YES,否则输出NO 首先需要判断行和列的总和是否相等,因为它们都应该是整个矩

哈尔滨理工大学2016新生赛E题

多组数据,每组测试数据输入9个整数,为1-9的一个全排列.初始状态会被描述为 1 2 3 4 5 6 7 8 9 Output 输出所需要的最小移动步数. Sample Input 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 Sample Output 0 12 将每个排列利用康托展开压缩为一个整数,采用广度优先搜索的方式不停的搜索直到得到目标状态即可. #include <stdio.h> #include <string.h> const int M

哈尔滨理工大学2016新生赛J题

给出一棵有N个节点(2 <= N <= 500000)和N-1条边的树,每条边拥有一个长度L(1 <= L <= 500000). 定义: (1)   path(u, v) = 顶点u和v之间的最短路. (2)   xor-distance(u, v) = ⊕e∈path(u,v)length(e), ⊕代表异或操作. 请计算出有多少对点的xor-distance的值等于K(0 <= K <= 500000).(v != u 并且 pair(u,v) = pair(v,

哈尔滨理工大学2016新生赛B题

做为长城上的卫士,影踪派一直守在螳螂高原上防止螳螂人卡拉克西的入侵.影踪派的长城可以近似看做是一条直线上依次编号为1~N的N个基地组成,编号相邻的两个基地之间由长城相连接,而影踪派掌门祝踏岚所在的影踪禅院位于编号为1的基地.     祝踏岚发现,每次螳螂人只会选择长城上的一个基地进行猛烈的攻击,所以,祝踏岚每次都要从影踪禅院赶到被攻击的基地亲临前线指挥战斗.但是,在长城上移动是很耗时的,为了能更快的赶到任何一个可能被攻击的基地,祝踏岚决定修建一对传送门.     一对传送门由两个入口组成,它能实

哈尔滨理工大学2016新生赛I题

这次我们要写一个简单的行编辑器,当按下'#'时代表按下了一次退格符,当按下'@'时代表一个退行符(使当前行的字符全部无效).例如,假设从终端接收了这样的两行字符: Whil#lr#e(s#*s) [email protected](*s=#++) 则实际有效的是下列两行: While(*s) putchar(*s++) 请你编写一个程序,输出实际有效的字符串. 第一行是一个整数T,表示测试数据组数. 接下来每行为一个字符串(不含空格和任何空白),表示输入的原始字符串 输出最终的正确字符串. 2

哈尔滨理工大学2016新生赛K题

小明这个人特别无聊,他喜欢把一个字符串以一个奇怪的姿势压缩起来.他会把连续的字符表示成字符和数字的形式,而且他用的数字还都是一位的!!!比如下面这个例子:"a12" 表示的是 "aaaa".也就是说压缩后的字符串里的每个数字表示重复最后一个出现的字符数字次,就好像上面的例子. 现在给你一些被无聊的小明压缩过的字符串,你能还原它么? 输入的第一行包括一个整数 T,表示数据的组数. 每组输入包括一行,一个字符串,表示被小明压缩过的字符串.长度不超过50. 每组输出包括一