zoukankan      html  css  js  c++  java
  • POJ 3349 Snowflake Snow Snowflakes(哈希)

    http://poj.org/problem?id=3349

    题意 :分别给你n片雪花的六个角的长度,让你比较一下这n个雪花有没有相同的。

    思路:一开始以为把每一个雪花的六个角的长度sort一下,然后再跟别的比,可实际上不是这样的,两个雪花相同的时候,角的顺序是固定的,可以是逆时针的也可以是顺时针的,因为雪花可以转动嘛,例如213456 和216543就是不一样的,这个题本身分类就是哈希,但是看到讨论里有人用暴力过的,,,我很是佩服,我压根就没往那个方面想,也许分类是哈希,我就认定哈希了吧,思维太固定了。

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <vector>
    
    using namespace std;
    const int maxx = 100100 ;
    int snow[maxx][6] ;
    const int len = 90001 ;
    vector <int >hash[len] ;
    
    bool judge(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 ;
        scanf("%d",&n) ;
        for(int i = 0 ; i < n ; i++)
        {
            for(int j = 0 ; j < 6 ; j++)
            scanf("%d",&snow[i][j]) ;
        }
        int sum, key ;
        for(int i = 0 ; i < n ; i++)
        {
            sum = 0 ;
            for(int j = 0 ; j < 6 ; j++)
            {
                sum += snow[i][j] ;
            }
            key = sum % len ;
            for(vector<int>::size_type j = 0; j < hash[key].size(); j++)
            {
                if(judge(hash[key][j], i))
                {
                   printf("Twin snowflakes found.
    ");
                   return 0;
                }
            }
            hash[key].push_back(i);
        }
        printf("%s
    ", "No two snowflakes are alike.");
        return 0;
    }
    View Code
  • 相关阅读:
    UVA 562 Dividing coins --01背包的变形
    HDU 2602 Bone Collector --01背包
    Topcoder SRM 618 Div2 --900
    【转】Python 列表排序
    线段树之区间最大连续和问题
    【转】Python中string的strip,lstrip,rstrip用法
    《Python核心编程》部分代码习题实践(持续更新)
    《Python核心编程》部分错误纠正(勘误表)(持续更新)
    UVA 103 Stacking Boxes --LIS
    POJ 1836 Alignment --LIS&LDS
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3522551.html
Copyright © 2011-2022 走看看