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. luogu P4139 上帝与集合的正确用法(扩展欧拉定理)

    本蒟蒻现在才知带扩展欧拉定理. 对于任意的\(b\geq\varphi(p)\)有 \(a^b\equiv a^{b\ mod\ \varphi(p)+\varphi(p)}(mod\ p)\) 当\ ...

  2. Python 中多线程之 _thread

    _thread模块是python 中多线程操作的一种模块方式,主要的原理是派生出多线程,然后给线程加锁,当线程结束的 时候取消锁,然后执行主程序 thread 模块和锁对象的说明 start_new_ ...

  3. 紫书 例题 11-12 UVa 1515 (最大流最小割)

    这道题要分隔草和洞, 然后刘汝佳就想到了"割"(不知道他怎么想的, 反正我没想到) 然后就按照这个思路走, 网络流建模然后求最大流最小割. 分成两部分, S和草连, 洞和T连 外围 ...

  4. MAVEN flex

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  5. 2015 Multi-University Training Contest 1 y sequence

    Y sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  6. PlayFramework的安装和配置以及向eclipse导入项目工程

    一.Play的安装和配置 1.首先去官网下载Play的包并将其解压 我下的是playframework2.2.1 2.配置play的环境变量方便使用 3.打开cmd运行play 输入play   he ...

  7. 洛谷——P1455 搭配购买

    https://www.luogu.org/problem/show?pid=1455 题目描述 明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某 ...

  8. 在使用shape的同一时候,用代码改动shape的颜色属性

    Android里面常常会使用shape来定制一些View的背景 能够改动View的背景颜色.形状等属性 普通情况下.shape都是在xml文件中面写死了.今天遇到一个需求,View的形状是圆角的,可是 ...

  9. input range 模拟滑块

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  10. Android Application 类共享全局数据

    android系统会为每一个程序执行时创建一个Application类的对象且仅创建一个.所以Application能够说是单例模式的一个类.且application对象的生命周期是整个程序中最长的, ...