Squares
Time Limit: 3500MS   Memory Limit: 65536K
Total Submissions: 17666   Accepted: 6735

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 rotating about its centre by 90 degrees gives the same polygon. It is not the only polygon with
the latter property, however, as a regular octagon also has this property.



So we all know what a square looks like, but can we find all possible squares that can be formed from a set of stars in a night sky? To make the problem easier, we will assume that the night sky is a 2-dimensional plane, and each star is specified by its x
and y coordinates.

Input

The input consists of a number of test cases. Each test case starts with the integer n (1 <= n <= 1000) indicating the number of points to follow. Each of the next n lines specify the x and y coordinates (two integers) of each
point. You may assume that the points are distinct and the magnitudes of the coordinates are less than 20000. The input is terminated when n = 0.

Output

For each test case, print on a line the number of squares one can form from the given stars.

Sample Input

4
1 0
0 1
1 1
0 0
9
0 0
1 0
2 0
0 2
1 2
2 2
0 1
1 1
2 1
4
-2 5
3 7
0 0
5 2
0

Sample Output

1
6
1

Source

先枚举两个点,通过数学公式得到另外2个点,使得这四个点可以成正方形。然后检查散点集中是否存在计算出来的那两个点,若存在,说明有一个正方形。

但这样的做法会使同一个正方形依照不同的顺序被枚举了四次。因此最后的结果要除以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)

能够用向量坐标来证明   对角线上俩坐标已知求还有一条对角线坐标

标记点x y时,key = (x^2+y^2)%prime

解决的地址冲突的方法,我使用了 链地址法

#include<iostream>  //1500K	 1000MS
#include<cstdio>
#include<cstring>
#include<cmath>
#define F 19999 using namespace std; struct zuo
{
int x,y;
} p[20001];
struct node
{
int x,y;
node *next;
}*head[20001];
int n;
int KK(zuo p1)
{
int key=(p1.x*p1.x+p1.y*p1.y)%F;
return key;
}
int Build(int k) //建立
{
int key=KK(p[k]);
if(!head[key])
{
head[key]=new node;
head[key]->next=NULL;
node *q;
q=new node;
q->x=p[k].x;
q->y=p[k].y;
q->next=NULL;
head[key]->next=q;
}
else
{
node *q,*top;
top=head[key];
q=head[key]->next;
while(q)
{
q=q->next;
top=top->next;
}
q=new node;
q->next=NULL;
q->x=p[k].x;
q->y=p[k].y;
top->next=q;
}
return 0;
}
int Count(zuo p1,zuo p2) //统计
{
int key1=KK(p1);
int flag=0;
int key2=KK(p2);
if(head[key1]&&head[key2]) //推断p1,p2是否在哈希表里
{
node *q=head[key1];
while(q)
{
if(q->x==p1.x&&q->y==p1.y)
{
flag=1;
break;
}
q=q->next;
}
if(flag==0)
return 0;
else
{
node *q=head[key2];
while(q)
{
if(q->x==p2.x&&q->y==p2.y)
{
return 1;
}
q=q->next;
}
}
}
return 0;
}
int main()
{
while(~scanf("%d",&n))
{
memset(head,0,sizeof(head));
if(!n)
break;
for(int i=0; i<n; i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
Build(i);
}
int num=0;
for(int i=0; i<n; i++)
{
for(int j=i+1; j<n; j++)
{
zuo p1,p2;
p1.x=p[i].x+(p[i].y-p[j].y);
p1.y=p[i].y-(p[i].x-p[j].x);
p2.x=p[j].x+(p[i].y-p[j].y);
p2.y=p[j].y-(p[i].x-p[j].x);
num+=Count(p1,p2); p1.x=p[i].x-(p[i].y-p[j].y);
p1.y=p[i].y+(p[i].x-p[j].x);
p2.x=p[j].x-(p[i].y-p[j].y);
p2.y=p[j].y+(p[i].x-p[j].x);
num+=Count(p1,p2);
}
}
printf("%d\n",num/4);
}
}

poj2002 哈希的更多相关文章

  1. poj2002 数正方形 (哈希+几何)

    题目传送门 题目大意:给你一堆点,问你能组成几个正方形. 思路:一开始想的是用对角线的长度来当哈希的key,但判断正方形会太复杂,然后就去找了一下正方形的判断方法,发现 已知: (x1,y1) (x2 ...

  2. POJ2002 二分查找&哈希

    问题重述: 给定整数n,以及n个点的坐标xi, yi.求这n个点可以组成的正方形的数目(每个点可重复使用). 分析: 根据正方形的性质,给定两个点就能确定可能构成的两个正方形的另外两个顶点.因此,只需 ...

  3. POJ-2002 Squares,哈希模板+数学公式!

                                                           Squares 题意:二维坐标轴给出n个点求有多少个正方形. 要是平时做比赛的话毫无疑问会 ...

  4. [PHP内核探索]PHP中的哈希表

    在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...

  5. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  6. Java 哈希表运用-LeetCode 1 Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  7. 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希

    据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...

  8. Oracle 哈希连接原理

    <基于Oracle的sql优化>里关于哈希连接的原理介绍如下: 哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法. 在Oracle 7.3 ...

  9. SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)

    今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...

随机推荐

  1. python自动化报错

    今天使用python.然而遇见了报错.抓狂的一笔.有说path写错的,有说是...网上查到的资料也是很少.后来突然发现,页面上我暂时能看到的元素可以定位并进行操作.看不到的无法进行...ps此时我没有 ...

  2. (2016北京集训十)【xsy1530】小Q与内存

    一道很有意思的神题~ 暴力平衡树的复杂度很对(并不),但是$2^{30}$的空间一脸屎 这题的正解是一个类似线段树的数据结构,我觉得很有创新性Orz 首先可以想到一种暴力就是用一个点代表一个区间,然后 ...

  3. 【Python常见问题总结】

    1. python2 中 end = '' 取消换行没有用 解决办法: 在程序开始加入 from __future__ import print_function 2. 如何在电脑上同时使用pytho ...

  4. WebLogic 服务器配置

    环境版本    Windows 8.1       WebLogic 10.3.0     JDK:1.6 WebLogic 创建域在Windows环境下有两种方式: 1.直接在开始菜单创建domai ...

  5. Github README.md中添加图片

    1.先把图片上传到你的项目中:然后在github网站上按路径打开图片,如下打开的图片链接: 2.复制图片的地址 3.然后在README.md写上: ![这里随便写文字](你刚复制的图片路径) 注意  ...

  6. 2015 Multi-University Training Contest 3 hdu 5323 Solve this interesting problem

    Solve this interesting problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  7. (原创)VS2017 C# 运行 Javasrcipt RSA 加密用户名登录 Java开发的服务器

    第一次写博客. 最近想做一个Web的自动登录,用户名和密码是RSA加密过的,后台是用的JAVA,我只会点C#,抓包什么都搞定了(使用的是Fiddler),不过由于C#和RSA的加密方式不同,我搞了N天 ...

  8. [Angular] Configure an Angular App at Runtime

    It always again happens (especially in real world scenarios) that you need to configure your Angular ...

  9. POJ 3254 Corn Fields 状态压缩DP (C++/Java)

    id=3254">http://poj.org/problem? id=3254 题目大意: 一个农民有n行m列的地方,每一个格子用1代表能够种草地,而0不能够.放牛仅仅能在有草地的. ...

  10. 12、NIO、AIO、BIO一

    1.NIO概述 什么是NIO:NIO是New I/O的简称,与旧式的基于流的I/O方式相对,从名字看,他表示新的一套JAVA I/O标准.它是在java1.4中被纳入到JDK中的,并具有以下特性: - ...