• 查找 --- 哈希优化


    <传送门>

    【题目大意】

    每片雪花都有6条arm,每条arm都有自己的长度,现在给你n个雪花,判断其中有没有同构的雪花。

    同构的含义:每片雪花都可以旋转,而且可以前后翻转,只要满足6条arm相等且一一对应就是同构。

    【题目分析】

    哈希表拉链法,如果没找到和当前雪花相同的雪花则将该雪花存入哈希表,等待下次查找,如果找到相同的雪花则输出。

    #include <stdio.h>
    #include <iostream>
    #include <stdlib.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    
    typedef struct node
    {
        int num[6];
        node *next;
        node()
        {
            for (int i = 0; i < 6; i++)
            {
                num[i] = -1;
            }
            next = NULL;
        }
    }Node;
    
    int main()
    {
        int n, sum, num[6];
        Node nodes[10000];
        bool flag = false;
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            sum = 0;
            for (int j = 0; j < 6; j++)
            {
                scanf("%d", &num[j]);
                sum += num[j];
            }
            if (!flag)
            {
                sort(num, num + 6);
                Node *pnode = &nodes[sum % 10000];
                while(pnode->next != NULL && !flag)
                {
                    pnode = pnode->next;
                    for (int j = 0; j < 6; j++)
                    {
                        if (pnode->num[j] != num[j])
                        {
                            break;
                        }
                        else
                        {
                            if (pnode->num[j] == num[j] && j == 5)
                            {
                                flag = true;
                            }
                        }
                    }
                }
                Node *newnode = new Node;
                for (int j = 0; j < 6; j++)
                {
                    newnode->num[j] = num[j];
                }
                pnode->next = newnode;
            }
        }
        if (flag)
        {
            printf("Twin snowflakes found.
    ");
        }
        else
        {
            printf("No two snowflakes are alike.
    ");
        }
        return 0;
    }
    View Code

    其实这题暴力也能过,而且超简单。

    #include<stdio.h>
    #include<stdlib.h>
    #include<algorithm>
    using namespace std;
    struct Node
    {
        int a,b,c,d,e,f;
    };
    Node node[100010];
    int a[6];
    bool cmp(Node x,Node y)
    {
        if(x.a!=y.a)
            return x.a<y.a;
        else if(x.b!=y.b)
            return x.b<y.b;
        else if(x.c!=y.c)
            return x.c<y.c;
        else if(x.d!=y.d)
            return x.d<y.d;
        else if(x.e!=y.e)
            return x.e<y.e;
        else return x.f<y.f;
    }
    
    
    int main()
    {
        int T;
        int i,j,k;
        scanf("%d",&T);
        for(i=0;i<T;i++)
        {
            for(j=0;j<6;j++)
            {
                scanf("%d",&a[j]);
            }
            sort(a,a+6);
            node[i].a=a[0];
            node[i].b=a[1];
            node[i].c=a[2];
            node[i].d=a[3];
            node[i].e=a[4];
            node[i].f=a[5];
        }
        sort(node,node+T,cmp);
        bool flag=0;
        for(i=0;i<T-1;i++)
        {
            if(node[i].a==node[i+1].a&&node[i].b==node[i+1].b&&node[i].c==node[i+1].c&&node[i].d==node[i+1].d&&node[i].e==node[i+1].e&&node[i].f==node[i+1].f)
            {
                printf("Twin snowflakes found.
    ");
                flag=1;
                break;
            }
        }
        if(!flag)
            printf("No two snowflakes are alike.
    ");
        return 0;
    }
    View Code
  • 相关阅读:
    浏览器extension
    windows 下使用免安装版的mysql
    windows下好用的工具
    那些没来得及做的事
    OSI模型的一张图
    倒计时输出脚本
    selenium忽略链接不安全页面提示的方法
    selenium控制浏览器滚动条缓慢下拉到最底
    paramiko连接主机基本操作
    django点击前端按钮展示后台列表
  • 原文地址:https://www.cnblogs.com/crazyacking/p/3761714.html
Copyright © 2020-2023  润新知