zoukankan      html  css  js  c++  java
  • 哈尔滨理工大学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 }
  • 相关阅读:
    做人做事方面 对于工作
    字符截取
    git 出现 error: bad signature fatal: index file corrupt
    一个项目设置两个git地址,并最终实现一次性同时推送到到两个git地址上的方法总结
    一个项目设置两个git地址,并最终实现一次性同时推送到到两个git地址上的方法总结
    Mysql创建用户并授权以及开启远程访问
    curl 錯誤碼
    php 计算2点之间的距离
    PHP百度地图开发之距离计算的实例分享
    如何在 Debian 9 上搭建 LNMP 环境
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/6105755.html
Copyright © 2011-2022 走看看