poj- 2002-Squares-哈希|除法散列法

数据结构——哈希表(散列)原理与代码应用 文章目录什么是哈希表?Hash的应用Hash复杂度散列表的查找步骤散列函数(哈希函数)——散列地址哈希表优缺点优点:缺点:散列的三种方法1、除法散列法2、平方散列法3、斐波那契(Fibonacci)散列法散列冲突的解决方案:扩展代码应用 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 记录的存储位置=f(关键 阅读详情

题意:

给你n 个点的坐标,让你去算一下,能够形成多少个正方形

思路:

1.枚举两个点,然后推出那两个的坐标,这样会有重复的,最后需要除以4

已知: (x1,y1)  (x2,y2)

则:   x3=x1+(y1-y2)   y3= y1-(x1-x2)

x4=x2+(y1-y2)   y4= y2-(x1-x2)

x3=x1-(y1-y2)   y3= y1+(x1-x2)

x4=x2-(y1-y2)   y4= y2+(x1-x2)

数学公式,也是看的网上的,自己没去推,同学们不要学我啊

2. 点的寻找要用哈希的方法,链地址法还是啥搞不懂,我用的是数组模拟链表,除法散列法

   求 key 的值的时候用的平方求于法

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define mod 100007
int tmp;
struct node
{
    int x, y;
    int next;
}ls[1010],a[1010];

int head[mod];

void add(int x,int y)
{
    int key = (x*x + y*y)%mod;
    if(head[key]==-1)
    {
        ls[tmp].x = x;
        ls[tmp].y = y;
        ls[tmp].next = -1;
        head[key] = tmp++;
    }
    else
    {
        int c = head[key];
        while(1)
        {
            if(ls[c].x == x && ls[c].y == y)
            {
                return;
            }
            if(ls[c].next == -1)
                break;
            c = ls[c].next;
        }
        ls[tmp].x = x;
        ls[tmp].y = y;
        ls[tmp].next = -1;
        ls[c].next = tmp++;
    }
}
int sear(int x, int y)
{
    int ad = (x*x +y*y)%mod;
    int c= head[ad];
    while(c!=-1)
    {
        if(ls[c].x == x && ls[c].y == y)
            return 1;
        c = ls[c].next;
    }
    return 0;
}
int main()
{
    int n;
    while(~scanf("%d",&n)&&n)
    {
        tmp = 1;
        memset(head,-1,sizeof(head));
        int i, j;
        for(i = 0; i < n; i++)
        {
            int x, y;
            scanf("%d%d",&x,&y);
            a[i].x = x;
            a[i].y = y;
            add(x,y);
        }
        int x3, y3, x4, y4;
        int cnt = 0;
        for(i = 0; i < n-1; i++)
        {
            for(j = i+1; j < n; j++)
            {
               x3 = a[i].x - (a[i].y-a[j].y);
               y3 = a[i].y + (a[i].x-a[j].x);
               x4 = a[j].x - (a[i].y - a[j].y);
               y4 = a[j].y + (a[i].x -a[j].x);

               if(sear(x3,y3)&&sear(x4,y4))
                cnt++;
               x3 = a[i].x + (a[i].y-a[j].y);
               y3 = a[i].y - (a[i].x-a[j].x);
               x4 = a[j].x + (a[i].y - a[j].y);
               y4 = a[j].y - (a[i].x -a[j].x);
               if(sear(x3,y3)&&sear(x4,y4))
                cnt++;

            }
        }
        printf("%d\n",cnt/4);
    }
    return 0;
}


2

map

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<climits>
#include<list>
#define MULT 20000

using  namespace std;
struct node
{
    int x,y;
}st[1200];
int main()
{
    int n;

    while(scanf("%d",&n),n!=0)
    {
        map<pair<int ,int>,int>hash_list;
        int i;
        int j;
        for(i=0;i<n;++i)
        {
            scanf("%d%d",&st[i].x,&st[i].y);
            hash_list[pair<int,int>(st[i].x,st[i].y)];
        }
        int sum=0;
        for(i=0;i<n;++i)
        {
            for(j=i+1;j<n;++j)
            {
                int  x,y,xx,yy;
                x=(st[i].x+st[j].x+st[i].y-st[j].y);
                y=(st[i].y+st[j].y+st[j].x-st[i].x);
                xx=(st[i].x+st[j].x-st[i].y+st[j].y);
                yy=(st[i].y+st[j].y-st[j].x+st[i].x);
                if(x&1||y&1||xx&1||yy&1)
                {
                    continue;
                }
                x/=2;
                y/=2;
                xx/=2;
                yy/=2;
                if(hash_list.count(pair<int,int>(x,y))&&hash_list.count(pair<int,int>(xx,yy)))
                {
                    sum++;
                }
            }
        }
        cout<<sum/2<<endl;
    }
}



单片机按键识别篇---单击---双击----长按   最近做一任务需要使用一个按键实现三种功能,分别是按键单击功能,按键双击功能和按键长按功能,可能之前没有接触过这类按键复用情况,顶多也只是简单识别单击和长按,没有想过双击以上按键功能,也是绞尽脑汁,想了半天,又上网看了些例程,算是对于按键的识别有点小小的了解,感觉这个功能挺实用,在此做个随笔。 一、思路   1.识别长按操作思路:我们使用系统定时器定时,然后让系统每过一段时间去扫描按键I/O... 阅读详情

相关推荐

实现labelme批量json_to_dataset方法

labelme可以帮助我们快速的实现Mask-RCNN中数据集json文件的生成,然而还需要我们进一步的将json转成dataset,可以直接在cmd中执行labelme_json_to_dataset.exe C:\Users\Administrator\Desktop\total\1.json(路径),但是这个过程需要我们一个json文件的生成,过程很慢。 一、打开abelm...

简简单单 5万+

《算法导论》11.3 除法散列法、乘法散列法 11.4 开放寻址法

本文为《算法导论》11.3 除法散列法、乘法散列法 11.4 开放寻址法的相关笔记,欢迎参考!有关代码之后会实现。

Toby的博客 1117

课程设计-UML旅游资源管理系统.doc

在这高科技的现代信息化的社会里,随着国人生活水平的不断提高,人们的生活方式不再仅限于普通的衣、食、住、行。人们不仅要在物质方面得到提高,而且在精神方面也追求有一个质的突变。于是,人们越来越多的选择在周末或节假日期间外出旅游,享受旅游给自己带来的乐趣,开阔视野,舒缓压力,陶冶情操。针对大众的这种需求,许许多多形形色色的旅行社就由此孕育而生,旅行社则需要由一个合适的管理系统来管理,所以旅行社管理信息系统的建立是十分必要的。将计算机这一信息处理利器应用于旅游资源的日常管理已是势必所然,而且这也将为旅行社的管理带来前所未有的改变,它可以带来意想不到的效益,同时也会为旅游业的飞速发展提供无限潜力。采用计算机管理信息系统已成为旅行社管理科学化和现代化的重要标志,它给旅行社管理带来了明显的经济效益和社会效益。主要体现在:极大提高了旅行社工作人员的工作效率,大大减少了以往人员冗余的问题。同时,也为广大游客创造了极大的方便! 基于旅行社管理的部分自动化,可以减少管理中的漏洞,可以节约不少管理开支,增加旅行社收入。 而在本次课程设计中,旅行社管理信息系统研究意义和研究的主要内容。首先对系统中用到的理

散列表(哈希表)

一,散列函数、散列表 散列函数是把一个集合映射到另外一个集合,使得数据更加规整、有序、紧缩。 例如,把字符串映射到整数,把平面上的整点映射到整数,把离散的整数映射到紧缩的整数集合,等等。 散列函数的值域,就是散列表。 二,冲突 ...

nameofcsdn的博客 4981

算法导论-除法散列法

h(k)=kmod  mh(k) =k \mod mh(k)=kmodm 当应用除法散列法时,要避免选择m的某些值。例如,m不应该是2的幂,因为如果m=2pm=2^pm=2p,则h(k)就是k的p个最低位数。除非已知各种最低p位的排列形式为等可能的,否则在设计函数时,最好考虑关键的所有位。 这段话什么意思呢?当m=23m=2^3m=23结果就会这样: 57 mod 8≡1057 mod 8≡3057 mod 8≡10057 mod 8≡157 \bmod 8 \equiv 1057 \bmod 8 \e.

一本郑经的程序员 623

POJ2002 - Squares(暴力枚举 & 双关键字二分查找)

题目链接:点击打开题目 Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 19211   Accepted: 7417 Description A square is a 4-sided polygon whose sides have

wyg1997 756

关于理解哈希表的除法散列法(取余法)

《算法精解-C语言描述》上

mkelehk的专栏 6767

除法散列函数之散列值问题

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33929309的博客 482

哈希表(散列表)原理详解

参考: 哈希表(散列表)原理详解 十一、从头到尾解析Hash表算法 什么是哈希表? 哈希表(散列表)原理详解 什么是哈希表?    哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 记录的存储位置=f(关键字) 这里的对应关系f称为散列函数,又称为哈希(Hash函数),采用散列技术将记录存

dev_zyx的博客 1347

C++进阶:哈希

哈希(hash)⼜称散列,是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。本质就是通过哈希函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进⾏快速查找。

QinMou 1115

算法導論14-除法散列法_某年某月_新浪博客

private void btn散列表_Click(object sender, EventArgs e) { int[] a = get_intArray(100); a = sjpxsz(a); var b = a.Take(20).ToArray(); ...

wf235y的博客 251

【算法导论】简单哈希表的除法实现

哈希表,又名散列表,hashtable。。。云云,看似很高大上,其实不过是直接寻址的延伸而已。直接寻址为何物,看一个数组:a[10],那么取其中一个元素a[1],这就是直接寻址,直接去这个a+1的地址上,就找到了这个数值,时间复杂度为O(1)。而哈希表的目的就是要让查找的时间复杂度尽量往O(1)上靠。

苦咖啡的自留地 2245

除法散列的散列值问题

除法散列法中,散列函数为:h(k) = k mod m 其中k为关键字,关键字全域为自然数集N;m为槽的个数。 为什么《算法导论》上说“m = 2^p,则h(k)就是k的p个最低位数字”呢? 我的思路是:由于10的p次(和p次以上)幂可以整除2的p次幂,所以决定余数的,实际是k最低p位,这部分的大小在10的0次幂到p-1次幂之间。

jshnaoko的博客 803

POJ - 2002 - Squares (hash算法)

题目:poj-2002 题意:给一些点的坐标,问最多可以构成多少个正方形。 直接四个点四个点地枚举肯定超时的,不可取。 普遍的做法是:先枚举两个点,通过数学公式得到另外2个点,使得这四个点能够成正方形。然后检查散点集中是否存在计算出来的那两个点,若存在,说明有一个正方形。 但这种做法会使同一个正方形按照不同的顺序被枚举了四次,因此最后的结果要除以4. 题解: 已知: (x1,y1) ...

Rotepad的博客 443

poj2002--Squares(n个点求正方形个数)

Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 16615   Accepted: 6320 Description A square is a 4-sided polygon whose sides have equal length and adja

随风的专栏 3351

POJ -2002 Squares(二分,几何问题)

Squares Time Limit: 3500MS Memory Limit: 65536K Description A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-degree angles. It is also a polygon such that ...

名字太长容易被发现并打死 553

除法散列法散列值问题

除法散列法似乎通过取k除以m的余数,来将关键字k映射到m个槽的某一个中去,亦即,散列函数为: h(k)=k mod m 当应用除法散列时,要注意m的选择。例如,m不应是2的幂,应为如果m=(2的p次)方,则 h(k)就是k的p个最低位数字。 问题是:对任意进制(s)的关键字k,m=(x的p次方),那么关键字k第几位(P)以前的值将不影响k的散列值? x如果不能整除进制,则p无确定值。 以下是...

weixin_33877885的博客 256

POJ-1200 Crazy Search,人生第一道hash题!

Crazy Search 真是不容易啊,人生第一道hash题竟然是搜博客看题解来的。 题意:给你一个包含m种字符的字符串,求长度为n的不同子串有多少个。 将每个字串化为一个具体的数然后存入数组标记即可,如果重复出现肯定不用再加了。那么怎么化为一个数呢,这里用的...

weixin_30247159的博客 220

POJ 刷题系列:2002. Squares

POJ 刷题系列:2002. Squares 传送门:2002. Squares 题意: 在二维坐标系下,给出若干点,求这些点最多能组成多少个正方形。 思路: 可以观察输入n只有1000,所以我们可以把这些点全部存入内存中(hash),因为已知正方形的两个点,可以求出另两个点的坐标。这样暴力枚举每个点,判断是否存在构成正方形的两个点。 代码如下: import java.

Demon-初来驾到 489

POJ2002-Squares

全解题报告索引目录 -> 【北大ACMPOJ试题分类】 转载请注明出处:http://exp-blog.com ------------------------------------------------------------------------- 大致题意: 有一堆平面散点集,任取四个点,求能组成正方形的不同组合方式有多少。 相同的四个点,不同顺序构成...

ζёСяêτ - 小優YoU 9921
上一篇: poj-Eqs-哈希
下一篇: poj-2503-Babelfish-字典树orMAP or 字符串哈希
RIPwangh
博客等级 码龄11年 42粉丝 172原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值