题目大意:原题链接

给定平面上的N个点,求出这些点一共可以构成多少个正方形。

解题思路:

若正方形为ABCD,A坐标为(x1, y1),B坐标为(x2, y2),则很容易可以推出C和D的坐标。对于特定的A和B坐标,C和D可以在线段AB的上面或者下面,即有两种情况。

            根据构造三角形全等可以得知(很简单,注意下细节,不要把坐标弄混就行)

CD在AB上面x3=x2+(y1-y2),y3=y2+(x2-x1);    x4=x1+(y1-y2),y4=y1+(x2-x1);

CD在AB下面x3=x2-(y1-y2),y3=y2-(x2-x1);      x4=x1-(y1-y2),y4=y1-(x2-x1);

因此只需要枚举点A和点B,然后计算出两种对应的C和D的坐标,判断是否存在即可。这样计算完之后得到的答案是正确答案的4倍,因为正方形的4条边都枚举了,所以答案要右移两位

Insert(int x,int y)采用平方求余法构造哈希函数,链地址法(用类邻接表法实现)处理冲突进行哈希

Judge(int x,int y)通过查找判断CD两点是否同时存在,即能判断是否可以构成正方形

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
const int N=;
int px[maxn],py[maxn];
struct Node
{
int x,y;
int next;
}node[N];
long long ans;
int n,cur,Hash[N]; void Insert(int x,int y)
{
int h=(x*x+y*y)%N;
node[cur].x=x;
node[cur].y=y;
node[cur].next=Hash[h];
Hash[h]=cur++;
}
bool Judge(int x,int y)
{
int h=(x*x+y*y)%N;
int next=Hash[h];
while(next!=-){
if(x==node[next].x&&y==node[next].y)
return true;
next=node[next].next;
}
return false;
} int main()
{
while(cin>>n,n){
memset(Hash,-,sizeof(Hash));
cur=,ans=;
for(int i=;i<n;i++){
cin>>px[i]>>py[i];
Insert(px[i],py[i]);
}
for(int i=;i<n;i++){//先枚举考虑CD在AB上面
for(int j=i+;j<n;j++){
int x3=px[j]+(py[i]-py[j]);
int y3=py[j]+(px[j]-px[i]);
int x4=px[i]+(py[i]-py[j]);
int y4=py[i]+(px[j]-px[i]);
if(Judge(x3,y3)&&Judge(x4,y4)) ans++;
}
}
for(int i=;i<n;i++){//再枚举考虑CD在AB下面
for(int j=i+;j<n;j++){
int x3=px[j]-(py[i]-py[j]);
int y3=py[j]-(px[j]-px[i]);
int x4=px[i]-(py[i]-py[j]);
int y4=py[i]-(px[j]-px[i]);
if(Judge(x3,y3)&&Judge(x4,y4)) ans++;
}//要判断C点和D点同时存在才能构成正方形
}
ans>>=;
printf("%lld\n",ans);
}
}

PKU 2002 Squares(二维点哈希+平方求余法+链地址法)的更多相关文章

  1. java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区

    java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测).链地址法.再哈希.建立公共溢出区 标签: hashmaphashmap冲突解决冲突的方法冲突 2016-0 ...

  2. Java 二维数组,排序、切换顺序,查表法二进制十进制,这班查找、排序(冒泡、选择)、遍历,获取最大小值(4)

    Java 二维数组,排序.切换顺序,查表法二进制十进制,折半查找.排序(冒泡.选择).遍历,获取最大小值(4)

  3. C# Dictionary源码剖析---哈希处理冲突的方法有:开放定址法、再哈希法、链地址法、建立一个公共溢出区等

    C# Dictionary源码剖析 参考:https://blog.csdn.net/exiaojiu/article/details/51252515 http://www.cnblogs.com/ ...

  4. SWUST OJ 1012哈希表(链地址法处理冲突)

    哈希表(链地址法处理冲突) 1000(ms) 10000(kb) 2676 / 6911 采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法.建立链表的时候采用尾插法 ...

  5. URAL - 1486 Equal Squares 二维哈希+二分

    During a discussion of problems at the Petrozavodsk Training Camp, Vova and Sasha argued about who o ...

  6. poj-3739. Special Squares(二维前缀和)

    题目链接: I. Special Squares There are some points and lines parellel to x-axis or y-axis on the plane. ...

  7. UVA - 11019 Matrix Matcher (二维字符串哈希)

    给你一个n*m的矩阵,和一个x*y的模式矩阵,求模式矩阵在原矩阵中的出现次数. 看上去是kmp在二维情况下的版本,但单纯的kmp已经无法做到了,所以考虑字符串哈希. 类比一维情况下的哈希算法,利用容斥 ...

  8. POJ 2002 Squares 解题报告(哈希 开放寻址 & 链式)

    经典好题. 题意是要我们找出所有的正方形.1000点,只有枚举咯. 如图,如果我们知道了正方形A,B的坐标,便可以推测出C,D两点的坐标.反之,遍历所有点作为A,B点,看C,D点是否存在.存在的话正方 ...

  9. Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区

    最近时间有点紧,暂时先放参考链接了,待有时间在总结一下: 查了好多,这几篇博客写的真心好,互有优缺点,大家一个一个看就会明白了: 参考 1. 先看这个明白拉链法(链地址法),这个带源码,很好看懂,只不 ...

随机推荐

  1. 《算法导论》— Chapter 12 二叉查找树

    序 查找树是一种数据结构,它支持多种动态集合操作.包含Search.Minimum.Maximum.PreDecessor.Successor.Insert.Delete等.它既能够用作字典,也能够用 ...

  2. 织梦dedecms整合discuz论坛的操作方法

    织梦dedecms和discuz论坛整合主要用途,是让两个系统共享用户数据,同一个用户可以在两个网站都可以登录.在我们制作织梦cms模板的时候,有时需要整合discuz里的东细.本文主要讲解一下ded ...

  3. Sublime Text2.0.2注冊码

    // Sublime Text 3 License Keys // Sublime Text 2.x -– BEGIN LICENSE -– Andrew Weber Single User Lice ...

  4. Android5.0新特性-Material Design

    概述 2014年,Google携Android5.X重装归来.全新的UI设计和更加优化的性能,令开发人员眼前一亮 安装和配置Android5.0开发环境 开发Android还得靠AS.下载地址 htt ...

  5. php 快速读取文件夹下文件列表

    在读取某个文件夹下的内容的时候 以前是使用 opendir readdir结合while循环过滤 . ..当前文件夹和父文件夹来操作的. 代码如下: 然后偶然发现了有scandir函数 可以扫描文件夹 ...

  6. JSP内置对象——request 及其响应get和post请求的实例

    request对象客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应.它是HttpServletRequest类的实例.request对象具有请求域,即完成客户端的 ...

  7. Android 中加载几百张图片做帧动画防止 OOM 的解决方案

    Android 中加载几百张图片做帧动画防止 OOM 的解决方案 最近,项目中有个需求:就是要做一个帧动画,按理说这个是很简单的!但是我能说这个帧动画拥有几百张图片吗?...... 填坑一 ---帧动 ...

  8. 初级Java面试题 – SSM框架篇

    加入我的QQ群(701974765) 获取更多好用又好玩的软件,还有不定期发放的福利呦(- ̄▽ ̄)- Spring的优点/对Spring的理解 Spring的AOP编程 Spring的IOC Spri ...

  9. 新浪博客:html+css+原生JS+Ajax初级+mySql数据库——源码

    **************************************************************************************************** ...

  10. Configuring Logging 配置日志

    NGINX Docs | Configuring Logging https://docs.nginx.com/nginx/admin-guide/monitoring/logging/[ 在上层设置 ...