POJ2002---正方形

简介: POJ2002---正方形

题目描述


正方形是边长相等且相邻边形成90度角的4边多边形。它也是一个多边形,围绕其中心旋转 90 度会得到相同的多边形。然而,它不是唯一具有后一特性的多边形,因为正八边形也具有此特性。


所以我们都知道正方形是什么样子的,但是我们能找到所有可能由夜空中的一组星星组成的正方形吗?为了使问题更容易,我们假设夜空是一个二维平面,每颗星星都由它的 x 和 y 坐标指定。


输入

输入由许多测试用例组成。每个测试用例以整数 n (1 <= n <= 1000) 开始,表示要跟踪的点数。接下来的 n 行中的每一行都指定了每个点的 x 和 y 坐标(两个整数)。您可以假设点是不同的,并且坐标的大小小于 20000。当 n = 0 时,输入终止。


输出

对于每个测试用例,在一行上打印一个人可以从给定的星星形成的正方形数。

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


思路分析

题目分析:直接将四个点枚举会超时,所以任意枚举两个点,将任意两个点算出来后判断是否在自己创建的hash表中.可以按照什么规则呢?如下图所示,我们把两个点当成相邻边的点,我们可以算出其他两个点的坐标.

7031cffd7d654ad398de9f466b301cdf.png

假设x1,x2,x3,x4的输入顺序是x1,x2,x3,x4则在进行枚举时(先以右上正方形为例)对于一个正方形会被ans++四次.

i-->x1;j-->x2;
i-->x1;j-->x4;
i-->x2;j-->x3;
i-->x3;j-->x4


当枚举到这四种情况时,都可以在hashTab中找到该正方形的其他两点,并且这四种情况对应的是同一个正方形.

同理左下正方形也是这个规律.

所以最终结果ans要 / 4;

参考代码

//POJ2002
#include<iostream>
using namespace std;
const int N=1010;
const int H=10007;
int ptx[N],pty[N];
struct Node{
  int x;
  int y;
  int next;
}; 
Node node[N];
int cur;//控制当前静态链表的下标的 
int n;
long ans;//统计数目
int hashTab[H];
void initHash() //这里不能使用memset因为这个仅对字符数组有效 
{
  for(int i = 0;i<H;i++){
    hashTab[i] = -1;
  }
  cur = 0;
  ans = 0;
 } 
void insertHash(int x,int y){
  int h = (x*x+y*y)%H; //Hash函数计算地址
  node[cur].x = x;
  node[cur].y = y;
  node[cur].next  = hashTab[h];//采用前插法 
  hashTab[h] = cur;
  cur++;
} 
int searchHash(int x,int y)
{
  int h = (x*x+y*y) % H;
  int next;
  next = hashTab[h];
  while(next!=-1){
    if(x==node[next].x&&y==node[next].y){
      return 1;
    } 
    next = node[next].next;
  }
  return 0;
 } 
 int main()
 {
  while(cin>>n&&n){
    initHash();
    for(int i = 0;i<n;i++)
    {
      scanf("%d%d",&ptx[i],&pty[i]);
      insertHash(ptx[i],pty[i]);
    }
    for(int i = 0; i< n;i++){
      for(int j = i+1;j<n;j++){
        int x3 = ptx[j]+(pty[i]-pty[j]);
        int y3 = pty[j]+(ptx[j]-ptx[i]);
        int x4 = ptx[i]+(pty[i]-pty[j]);
        int y4 = pty[i]+(ptx[j]-ptx[i]);
        if(searchHash(x3,y3)&&searchHash(x4,y4)){
          ans++;
        }
      }
    }
    for(int i = 0; i< n;i++){
      for(int j = i+1;j<n;j++){
        int x3 = ptx[j]-(pty[i]-pty[j]);
        int y3 = pty[j]-(ptx[j]-ptx[i]);
        int x4 = ptx[i]-(pty[i]-pty[j]);
        int y4 = pty[i]-(ptx[j]-ptx[i]);
        if(searchHash(x3,y3)&&searchHash(x4,y4)){
          ans++;
        }
      }
    }
    ans>>=2;
    printf("%ld\n",ans);
   }
  return 0;
 }

注意:本题使用线性探测法会出现多个数据堆积,然后运行超时.

相关文章
|
7天前
|
云安全 人工智能 自然语言处理
|
11天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
991 35
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
673 4
|
7天前
|
机器学习/深度学习 人工智能 数据可视化
1秒生图!6B参数如何“以小博大”生成超真实图像?
Z-Image是6B参数开源图像生成模型,仅需16GB显存即可生成媲美百亿级模型的超真实图像,支持中英双语文本渲染与智能编辑,登顶Hugging Face趋势榜,首日下载破50万。
527 25
|
14天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
859 59
Meta SAM3开源:让图像分割,听懂你的话
|
4天前
|
弹性计算 网络协议 Linux
阿里云ECS云服务器详细新手购买流程步骤(图文详解)
新手怎么购买阿里云服务器ECS?今天出一期阿里云服务器ECS自定义购买流程:图文全解析,阿里云服务器ECS购买流程图解,自定义购买ECS的设置选项是最复杂的,以自定义购买云服务器ECS为例,包括付费类型、地域、网络及可用区、实例、镜像、系统盘、数据盘、公网IP、安全组及登录凭证详细设置教程:
195 114
|
11天前
|
人工智能 前端开发 算法
大厂CIO独家分享:AI如何重塑开发者未来十年
在 AI 时代,若你还在紧盯代码量、执着于全栈工程师的招聘,或者仅凭技术贡献率来评判价值,执着于业务提效的比例而忽略产研价值,你很可能已经被所谓的“常识”困住了脚步。
576 50
大厂CIO独家分享:AI如何重塑开发者未来十年
|
7天前
|
存储 自然语言处理 测试技术
一行代码,让 Elasticsearch 集群瞬间雪崩——5000W 数据压测下的性能避坑全攻略
本文深入剖析 Elasticsearch 中模糊查询的三大陷阱及性能优化方案。通过5000 万级数据量下做了高压测试,用真实数据复刻事故现场,助力开发者规避“查询雪崩”,为您的业务保驾护航。
382 25