题目链接:http://poj.org/problem?id=2002

题意:给定n个点,问有多少种方法可以组成正方形。

思路:我们可以根据两个点求出对应正方形[有2个一个在两点左边,一个在两点右边]另外两个点的左边。例如

已知:(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)

枚举两个点,进行HASH,然后再枚举两个点然后求另外两个点,再从HASH表找,冲突用拉链法。

这种做法会使同一个正方形按照不同的顺序被枚举了四次,因此最后的结果要除以4.

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<set>
using namespace std;
typedef long long int LL;
typedef unsigned int uint;
const int MAXN=+;
const int MOD=;
struct Point{
int x,y;
Point(int a=,int b=):x(a),y(b){};
};
Point P[MAXN];
vector<Point>Hash[MOD];
void Init(){
for(int i=;i<MOD;i++){
Hash[i].clear();
}
}
void InsetHash(Point a){
int Num=(a.x*a.x+a.y*a.y)%MOD;
Hash[Num].push_back(a);
}
bool Search(Point a){
int Num=(a.x*a.x+a.y*a.y)%MOD;
for(int i=;i<Hash[Num].size();i++){
if(a.x==Hash[Num][i].x&&a.y==Hash[Num][i].y){
return true;
}
}
return false;
}
int main(){
#ifdef kirito
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int n;
while(scanf("%d",&n)&&n){
int ans=; Init();
for(int i=;i<n;i++){
scanf("%d %d",&P[i].x,&P[i].y);
}
for(int i=;i<n;i++){
InsetHash(P[i]);
}
for(int i=;i<n;i++){
for(int j=i+;j<n;j++){
Point C,D;
C.x=P[i].x+(P[i].y-P[j].y); C.y=P[i].y-(P[i].x-P[j].x);
D.x=P[j].x+(P[i].y-P[j].y); D.y=P[j].y-(P[i].x-P[j].x);
if(Search(C)&&Search(D)){
ans++;
}
C.x=P[i].x-(P[i].y-P[j].y); C.y=P[i].y+(P[i].x-P[j].x);
D.x=P[j].x-(P[i].y-P[j].y); D.y=P[j].y+(P[i].x-P[j].x);
if(Search(C)&&Search(D)){
ans++;
}
}
}
printf("%d\n",ans>>);
}
return ;
}

POJ 2002 统计正方形 HASH的更多相关文章

  1. POJ 1971 统计平行四边形 HASH

    题目链接:http://poj.org/problem?id=1971 题意:给定n个坐标.问有多少种方法可以组成平行四边形.题目保证不会有4个点共线的情况. 思路:可以发现平行四边形的一个特点,就是 ...

  2. POJ 2002 Squares 数学 + 必须hash

    http://poj.org/problem?id=2002 只能说hash比二分快很多.随便一个hash函数都可以完爆二分. 判断是否存在正方形思路如下: 1.枚举任意两个点,作为正方形的一条边,那 ...

  3. poj 2002(好题 链式hash+已知正方形两点求另外两点)

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 18493   Accepted: 7124 Descript ...

  4. POJ 2002 点hash

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 15489   Accepted: 5864 Descript ...

  5. Squares - poj 2002(hash)

    枚举两个点作为一条边,求出正方形的另外两个点,利用hash查找另外两个点. #include<stdio.h> #include<string.h> #include<s ...

  6. POJ 2002 几何+hash

    题目大意: 给定1000个点,寻找有多少组四点对能组成正方形 这里的题目跟上一道做的找平行四边形类似但想法却又不相同的方法 这里找任意2个点形成的一条边,那么可以根据这两个点,找到能和他们组成正方形剩 ...

  7. POJ 2002 Squares [hash]

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 16631   Accepted: 6328 Descript ...

  8. POJ 3320 (尺取法+Hash)

    题目链接: http://poj.org/problem?id=3320 题目大意:一本书有P页,每页有个知识点,知识点可以重复.问至少连续读几页,使得覆盖全部知识点. 解题思路: 知识点是有重复的, ...

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

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

随机推荐

  1. 【hadoop2.6.0】利用Hadoop的 Java API

    Hadoop2.6.0的所有Java API都在 http://hadoop.apache.org/docs/r2.6.0/api/overview-summary.html 里. 下面实现一个利用J ...

  2. 如何把一个excel工作薄中N个工作表复制到另一个工作薄中

    一般遇到标题这样的情况,许多人可能会一个一个的复制粘贴,其实完全不必那么麻烦. 你可以按以下步骤来操作: 第一步:打开所有要操作的excel工作薄\n 第二步:按住Shift键,选择所有要复制的工作表 ...

  3. ios WaxPatch热更新原理

    以下是引用他人文章内容: 为什么需要 WaxPatch 很多情况下,已经在 AppStore 上线的应用需要紧急缺陷修复,此时便需要使用某些技术手段,使应用程序能够动态下载补丁,进行缺陷修复. 什么是 ...

  4. Eclipse CDT launch failed.Binary not found in Linux/Ubuntu

    转自:http://blog.csdn.net/abcjennifer/article/details/7573916 Linux下出现launch failed.Binary not found的解 ...

  5. 模拟赛1029d2

    [问题描述]祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色.此后,你可以发射珠子到轨道上并加入原有序列中.一旦有三个或更多同色的珠子变 ...

  6. ASP.NET Global 全局事件处理

    添加Global文件,名字不要改 Global类说明: using System; using System.Collections.Generic; using System.IO; using S ...

  7. ASP.NET MVC中解决日志并发处理log4net

    本章主要内容是将异常信息写到队列中,然后通过线程写到文本文件中,速度非常快,没有阻塞和延迟加载 1.首先在Model中建一个类MyExceptionAttribute.cs public class ...

  8. 【转】VS项目属性的一些配置项的总结

    首先,解决方案和项目文件夹包含关系(c++项目): VS解决方案和各个项目文件夹以及解决方案和各个项目对应的配置文件包含关系,假设新建一个项目ssyy,解决方案起名fangan,注意解决方案包括项目, ...

  9. Innodb之拷贝InnoDB表从一服务器到另一台服务器2

    本章节阐述将表移动到不同server上的技术.如可以将整个Mysql 实例转移到更大.更快的Server上:也可以拷贝整个实例到Slave上:也可以拷贝单个表或某些表到其他Server上(数据仓库). ...

  10. hdu 2027统计元音

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2027 思路:主要考察gets()函数用法,能够接受输入的空格,如果用%s或是cin>>st ...