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

题意:平面上给定n个点,求由这些点能构成多少个正方形。

分析:我们枚举两个点,那么在这两个点形成的直线两边可以计算出正方形的另外两个点,利用Hash然后查找即可。

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
typedef long long LL;
const int N = 1005;
const int H = 10007;
struct Point
{
int x,y;
};
Point p[N];
struct Node
{
int x,y;
int next;
};
Node node[N];
int cur,n;
LL ans;
int Hash[H];
void Init()
{
for(int i=0;i<H;i++)
Hash[i] = -1;
cur = ans = 0;
}
void Insert(int x,int y)
{
int h = (x * x + y * y) % H;
node[cur].x = x;
node[cur].y = y;
node[cur].next = Hash[h];
Hash[h] = cur++;
}
bool Search(int x,int y)
{
int h = (x * x + y * y) % H;
int t = Hash[h];
while(t != -1)
{
if(x == node[t].x && y == node[t].y) return true;
t = node[t].next;
}
return false;
}
LL Work()
{
Init();
for(int i=0;i<n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
Insert(p[i].x,p[i].y);
}
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
int x1 = p[i].x - (p[i].y - p[j].y);
int y1 = p[i].y + (p[i].x - p[j].x);
int x2 = p[j].x - (p[i].y - p[j].y);
int y2 = p[j].y + (p[i].x - p[j].x);
if(Search(x1,y1) && Search(x2,y2)) ans++;
}
}
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
int x1 = p[i].x + (p[i].y - p[j].y);
int y1 = p[i].y - (p[i].x - p[j].x);
int x2 = p[j].x + (p[i].y - p[j].y);
int y2 = p[j].y - (p[i].x - p[j].x);
if(Search(x1,y1) && Search(x2,y2)) ans++;
}
}
ans >>= 2;
return ans;
}
int main()
{
while(~scanf("%d",&n),n)
printf("%I64d\n",Work());
return 0;
}

题目:http://acm.hust.edu.cn/problem.php?id=1623

分析:本题与上题一样,只是注意本题中的点可能重合,所以一定要先去重。

正方形个数(二维点哈希)相关推荐

  1. 理想的正方形 HAOI2007(二维RMQ)

    理想的正方形 省队选拔赛河南  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master       题目描述 Description 有一个a*b的整数组成的矩阵,现 ...

  2. P2216 [HAOI2007]理想的正方形(二维RMQ)

    题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...

  3. P2601 [ZJOI2009]对称的正方形(二维哈希)(二分)

    洛谷传送门 文章目录 题目描述 解析 代码 题目描述 解析 做三个hash 分一下正方形边长的奇偶性 然后枚举中心点,二分边长即可 有点类似模拟赛那道红十字的题 我一开始觉得分奇偶好麻烦啊 为什么不直 ...

  4. bzoj 1414 bzoj 3705: [ZJOI2009]对称的正方形(二维Hash)

    1414: [ZJOI2009]对称的正方形 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 727  Solved: 345 [Submit][St ...

  5. [luoguP2601] [ZJOI2009]对称的正方形(二维Hash + 二分 || Manacher)

    传送门 很蒙蔽,不知道怎么搞. 网上看题解有说可以哈希+二分搞,也有的人说用Manacher搞,Manacher是什么鬼?以后再学. 对于这个题,可以从矩阵4个角hash一遍,然后枚举矩阵中的点,再二 ...

  6. 二维数组:随机生产,遍历,判断两个数组一维二维长度,和内容是否一致

    import java.util.Random;/*** 1,定义第一个方法,传入数组长度,返回一个1维和2维长度都完全相同的数组* 2.定义一个方法,传入两个数二维组,判断两个数组是否完全一致:一维 ...

  7. C语言 二维数组遍历 - C语言零基础入门教程

    目录 一.计算一维数组长度 二.计算二维数组长度 1.二维数组行数 2.二维数组列数 3.二维数组的元素个数 = 二维数组行数 * 二维数组列数 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C ...

  8. C语言 二维数组行数和列数计算 - C语言零基础入门教程

    目录 一.计算一维数组长度 二.计算二维数组长度 1.二维数组行数 2.二维数组列数 3.二维数组的元素个数 = 二维数组行数 * 二维数组列数 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C ...

  9. 通通WPF随笔(3)——艺术二维码素材生成器

    最近公司让我开发一个条形码的生成控件,花了半天时间搞定觉得不过瘾,什么年代了该用二维码了吧.于是wiki了一下二维码的资料. 比较常见的就是QR码(Quick Response)即快速识别码,为了验证 ...

最新文章

  1. 《未来企业效率白皮书》
  2. 前沿科技山雨欲来,四大领域存创新机会
  3. 北信源IPO,拟筹资开发企业级云安全管理平台
  4. 据说这是个电子元器件采购的春天,我们该如何把握机遇?
  5. 一个完整的Web应用程序部署示例
  6. 广州站 | 云原生 Serverless 技术实践营精彩回顾
  7. Laravel event 事件的简单使用
  8. Linux下conda 安装以后 activate无法使用
  9. 浅谈JAVA工作流的优雅实现方式
  10. fir低通滤波器c语言,大神教你:FIR与IIR低通滤波器的最简最快实现
  11. JVM——垃圾回收算法
  12. 苹果手机有护眼模式吗_暗黑模式=护眼模式?其实手机中的这个设置才真正护眼...
  13. 【C++ 第五章 个人银行账户管理程序案例】
  14. java程序 下雨,利用SurfaceView实现下雨与下雪动画效果详解(Kotlin语法)
  15. Python列表实现矩阵的创建、输入输出、转化转置、加减乘运算并设计一个矩阵计算器GUI界面
  16. 鸿蒙无法使用安卓应用市场,关于华为鸿蒙兼容安卓应用的原因与思考
  17. 奇异值分解究竟是个啥,该如何理解
  18. C语言实现-求m到n之和
  19. HTML中的<a>标签
  20. 中国三大港进入全球最高效港口排名前十,新兴市场物流竞争力中国第一,印度和南亚或继续充当西方买家采购替代市场 | 美通社头条...

热门文章

  1. 基于SpringJDBC 实现关键功能-ClassMappings
  2. Actuator提供的endpoint
  3. 用户user空间和内核kernel空间
  4. SpringMVC的数据响应-页面跳转-返回ModelAndView形式1(应用)
  5. 原始Junit测试Spring的问题
  6. 微信扫描登录(获取扫描人信息)
  7. ThreadLocal的空指针异常问题
  8. ReactJS入门之JSX语法
  9. 数据库-数据库的介绍
  10. nacos云环境集群部署