Time Limit: 3500MS   Memory Limit: 65536K
Total Submissions: 14328   Accepted: 5393

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
题意:给出n个点的坐标,计算这些点可以构成多少个正方形,不同顺序的相同四个点被视为同一个正方形。 思路:这里n最大是1000,显然一个点一个点的枚举不行。参考了别人的结题报告,据说有这样的定理:
   已知(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);
因此可以先枚举两个点,根据这两个点(点1 ,点2)的坐标可以得到另外两个点(点3, 点4),若在哈希表中能找得到这两个(点3, 点4),说明能构成一个正方形,
注意每个点被枚举了四次,最后要除以4;
再者就是找哈希函数,这里用的平方取余法,每输入一个点,就将这个点插入哈希表中;
这个题也受了 poj 3274的启发;
 #include<stdio.h>
#include<string.h> const int prime = ;
struct node
{
int x,y;
}pos[]; struct HashTable
{
int x;
int y;
struct HashTable* next;
}*Hash[prime];//Hash[]是指针数组,存放地址;
int n; //插入哈希表
void hash_insert(int x, int y)
{
int key = (x*x + y*y)%prime;//平方求余法;
if(!Hash[key])
{
Hash[key] = new struct HashTable;
Hash[key]->x = x;
Hash[key]->y = y;
Hash[key]->next = NULL;
}
else
{
struct HashTable *tmp = Hash[key];
while(tmp->next)
tmp = tmp->next;//开放寻址,直到next为空
//插入新结点
tmp->next = new struct HashTable;
tmp->next->x = x;
tmp->next->y = y;
tmp->next->next = NULL;
}
}
bool find(int x, int y)
{
int key = (x*x+y*y)%prime;
if(!Hash[key])
return false;//key 对应的地址不存在,
else
{
struct HashTable *tmp = Hash[key];
while(tmp)
{
if(tmp->x == x && tmp->y == y)
return true;
tmp = tmp->next;
}
return false;
}
}
int main()
{
while(scanf("%d",&n)!= EOF)
{
int i,j;
if(n == ) break;
memset(Hash,,sizeof(Hash));
for(i = ; i < n; i++)
{
scanf("%d %d",&pos[i].x,&pos[i].y);
hash_insert(pos[i].x, pos[i].y);
}
int ans = ;
for(i = ; i < n-; i++)
{
for(j = i+; j < n; j++)
{
int x1 = pos[i].x, y1 = pos[i].y;
int x2 = pos[j].x, y2 = pos[j].y;
int add_x = x1-x2,add_y = y1-y2;
int x3 = x1+add_y;
int y3 = y1-add_x;
int x4 = x2+add_y;
int y4 = y2-add_x;
if(find(x3,y3) && find(x4,y4))
ans++; x3 = x1-add_y;
y3 = y1+add_x;
x4 = x2-add_y;
y4 = y2+add_x;
if(find(x3,y3) && find(x4,y4))
ans++;
}
}
printf("%d\n",ans/);
}
return ;
}

Squares(哈希)的更多相关文章

  1. Squares<哈希>

    Description A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-d ...

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

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

  3. POJ 2002 Squares 哈希

    题目链接: http://poj.org/problem?id=2002 #include <stdio.h> #include <string.h> ; struct Has ...

  4. poj 2002 Squares 几何二分 || 哈希

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 15137   Accepted: 5749 Descript ...

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

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

  6. 【URAL 1486】Equal Squares(二维哈希+二分)

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

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

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

  8. PKU 2002 Squares(二维点哈希+平方求余法+链地址法)

    题目大意:原题链接 给定平面上的N个点,求出这些点一共可以构成多少个正方形. 解题思路: 若正方形为ABCD,A坐标为(x1, y1),B坐标为(x2, y2),则很容易可以推出C和D的坐标.对于特定 ...

  9. poj Squares n个点,共能组成多少个正方形 二分 + 哈希

    题目链接:http://poj.org/problem?id=2002 测试数据: 41 00 11 10 090 01 02 00 21 22 20 11 12 14-2 53 70 05 20 有 ...

随机推荐

  1. ProGuard详解

    综述 对于ProGuard工具想必我们都不陌生,它能够通过移除无用代码,使用简短无意义的名称来重命名类,字段和方法.从而能够达到压缩.优化和混淆代码的目的.最终我们会获取一个较小的apk文件,并且我们 ...

  2. 编程基础-msdn编程指南笔记

    此博仅为笔记,摘自msdn编程指南文档,链接地址:http://msdn.microsoft.com/zh-cn/library/67ef8sbd.aspx 注释:// 单行注释 /* 多行注释*/ ...

  3. CSS3伪类nth-child结合transiton动画实现文字若影若现

    css3伪类nth-child结合transiton动画实现文字若影若现收先创建一个div盒子,然后包裹在div中的有10个span标签每个span标签填上内容一次为A,B,C,D,E,F,G,H,I ...

  4. 我是一块cpu 《转载》

    我是一块cpu,原装intel,在一台普通的台式计算机里供职.我有个小弟是内存,我要靠他时时刻刻陪伴我工作,其实有时候我并不是没有某某地址的资料,而是懒得翻--麻烦. 还有一个老大哥叫bios,每次那 ...

  5. Oracle分区表学习

    (1) 表空间及分区表的概念表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间.分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应 ...

  6. javascript基础学习(九)

    javascript之基本包装类型 学习要点: 基本包装类型概述 Boolean类型 Number类型 String类型 一.基本包装类型概述 为了便于操作基本类型值,提供了3种特殊的引用类型:Boo ...

  7. 显示scrollbar

    修改CSS overflow的值 overflow: 参考MDN 例子: overflow: auto or scroll

  8. 【vc】14_网络编程_socket编程

    1.计算机网络基本知识 最简单的网络程序如图: 提示:IP地址就相当于一个公司的总机号码,端口号就相当于分机号码.在打电话时,拨通总机后,还需要转到分机上. (1)协议 ·为进行网络中的数据交换(通信 ...

  9. SGU 123.The sum

    #include <iostream> using namespace std; int f[50]={0,1,1}; int main(){ int n,s=0; cin>> ...

  10. SGU 197.Nice Patterns Strike Back

    时间限制:0.5s 空间限制:6M 题意: 给出长n(n<=10^100)和宽m(m<=5)的地面,铺上黑色和白色的地板,使得没有任意一个2*2大小的地面铺同种颜色的方案数是多少. Sol ...