题目描述

输入N个互不相同的二维整数坐标,求这N个坐标可以构成的正方形数量。[内积为零的的两个向量垂直]

输入描述
第一行输入为N,N代表坐标数量,N为正整数。N <= 100
之后的 K 行输入为坐标x y以空格分隔,x,y为整数,-10<=x, y<=10

输出描述
输出可以构成的正方形数量。

用例
输入

3
1 3
2 4
3 1

输出

0

说明

(3个点不足以构成正方形)

输入

4
0 0
1 2
3 1
2 -1

输出

1

二维坐标构成正方形数量计算

核心解题思路

该题的关键在于利用几何性质来高效判断正方形的存在。已知两个点((x_1,y_1))和((x_2,y_2)),根据正方形的几何特征,可通过向量旋转(90^{\circ})的方式计算出另外两个可能的对角点坐标。

向量(\overrightarrow{AB}=(x_2 - x_1, y_2 - y_1)),将其旋转(90{\circ})(顺时针或逆时针),得到新向量。若原向量为((a,b)),顺时针旋转(90{\circ})后为((b,-a)),逆时针旋转(90^{\circ})后为((-b,a))。基于此,根据已知两点计算出另外两个可能的对角点坐标,然后检查这两个点是否都存在于给定的坐标列表中。若存在,则说明这四个点可以构成一个正方形。由于每个正方形在遍历点对的过程中会被计算(4)次(不同的边作为起始边),所以最终结果需要除以(4)。

完整代码实现

# 定义一个函数来判断两个点是否相等
def are_points_equal(p1, p2):return p1[0] == p2[0] and p1[1] == p2[1]# 定义一个函数来检查一个点是否存在于点列表中
def point_exists(points, p):for point in points:if are_points_equal(point, p):return Truereturn False# 读取坐标数量
n = int(input())
coordinates = []# 读取坐标并存入列表
for _ in range(n):x, y = map(int, input().split())coordinates.append((x, y))square_count = 0# 遍历所有点对,检查是否能构成正方形
for i in range(n):x1, y1 = coordinates[i]for j in range(i + 1, n):x2, y2 = coordinates[j]# 计算两个可能的对角点x3, y3 = x1 - (y1 - y2), y1 + (x1 - x2)x4, y4 = x2 - (y1 - y2), y2 + (x1 - x2)p3 = (x3, y3)p4 = (x4, y4)if point_exists(coordinates, p3) and point_exists(coordinates, p4):square_count += 1# 计算另外两个可能的对角点x5, y5 = x1 + (y1 - y2), y1 - (x1 - x2)x6, y6 = x2 + (y1 - y2), y2 - (x1 - x2)p5 = (x5, y5)p6 = (x6, y6)if point_exists(coordinates, p5) and point_exists(coordinates, p6):square_count += 1# 每个正方形被计算了4次,因此结果需要除以4
print(square_count // 4)

算法原理解析

点相等判断函数 are_points_equal

该函数通过比较两个点坐标的(x)值和(y)值是否分别相等,来判断两个点是否为同一个点。若(p1)的(x)坐标等于(p2)的(x)坐标,且(p1)的(y)坐标等于(p2)的(y)坐标,则返回 True,否则返回 False

点存在检查函数 point_exists

遍历给定的点列表 points,对于列表中的每一个点,调用 are_points_equal 函数检查其是否与目标点 p 相等。若存在相等的点,则返回 True,表示目标点存在于列表中;遍历结束仍未找到相等的点,则返回 False

主逻辑

  • 读取坐标数量 n 和具体的坐标值并存入列表 coordinates
  • 两层循环遍历所有的点对 ((i, j))((i < j)):
    • 根据当前点对的坐标 ((x_1,y_1)) 和 ((x_2,y_2)),通过向量旋转的几何原理计算出两组可能的对角点坐标(如 (x3,y3)(x4,y4)(x5,y5)(x6,y6) )。
    • 分别检查每组对角点是否都存在于 coordinates 列表中。若存在,则 square_count 计数器加 (1)。
  • 由于每个正方形在遍历点对的过程中会被计算 (4) 次(不同的边作为起始边),所以最终结果 square_count 需要除以 (4) 得到实际的正方形数量。

示例解析

示例一(输入 (3) 个点)

输入:

3
1 3
2 4
3 1

在两层循环中,由于只有 (3) 个点,当外层循环 i 取到 (2)(索引从 (0) 开始)时,内层循环 j 从 (i + 1 = 3) 开始,而总共有 (3) 个点,索引最大为 (2),内层循环不会执行。因此,square_count 始终为 (0),最终输出 (0),符合 (3) 个点无法构成正方形的条件。

示例二(输入 (4) 个点能构成 (1) 个正方形)

输入:

4
0 0
1 2
3 1
2 -1

假设我们取点对 ((0,0)) 和 ((1,2)):

  • 计算第一组对角点:
    (x3 = 0 - (0 - 2) = 2),(y3 = 0 + (0 - 1) = -1),即 (p3 = (2,-1))
    (x4 = 1 - (0 - 2) = 3),(y4 = 2 + (0 - 1) = 1),即 (p4 = (3,1))
    检查发现 (p3) 和 (p4) 都存在于坐标列表中,square_count 加 (1)。
  • 计算第二组对角点时(可能不符合条件,此处不详细展开)。
    由于存在这样一组符合条件的对角点,且经过其他点对计算(可能重复计算同一个正方形的不同边),最终 square_count 会累加到 (4)(因为每个正方形被计算 (4) 次),除以 (4) 后输出 (1)。

总结

此代码通过巧妙利用几何中向量旋转的性质,避免了复杂的四重循环判断所有四个点组合的方式,大大提高了计算效率。对于初学者来说,理解向量旋转与坐标计算的关系是关键。通过 are_points_equalpoint_exists 函数实现了点的基本操作判断,主逻辑部分通过遍历点对并结合几何计算来统计正方形数量。这种方法不仅在代码实现上相对简洁,而且在算法效率上也有较好的表现,适用于给定规模((N <= 100))的坐标输入情况。通过对示例的分析,能更清晰地看到代码如何根据输入数据进行计算并得出正确结果,有助于深入理解整个算法流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84636.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84636.shtml
英文地址,请注明出处:http://en.pswp.cn/web/84636.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt:智能指针QScopedPointer使用

QScopedPointer和C中的智能指针std::unique_ptr其概念是一样的&#xff0c;它包装了new操作符在堆上分配的动态对象&#xff0c;能够保证动态创建的对象在任何时候都可以被正确地删除。但它有更严格的所有权&#xff0c;并且不能转让&#xff0c;一旦获取了对象的管理权&#x…

TensorFlow基础之理解计算图

Tensor Flow TensorFlow 本章介绍TensorFlow的基础。特别地&#xff0c;你将学习如何用TensorFlow进行基础计算。在开始使用 TensorFlow之前,你必须理解它背后的哲学。 这个库基于计算图的概念&#xff0c;如果你不理解计算图是如何工作的&#xff0c;你就不能理解如何使用这…

【HarmonyOS Next之旅】DevEco Studio使用指南(三十五) -> 配置构建(二)

目录 1 -> 定制HAP多目标构建产物 1.1 -> 定义产物的HAP包名 1.2 -> 定义产物的deviceType 1.3 -> 定义产物的distributionFilter 1.4 -> 定义产物preloads的分包 1.5 -> 定义产物的source源码集-pages 1.6 -> 定义产物的source源码集-sourceRoots…

[muduo] ThreadPool | TcpClient | 异步任务 | 通信测试

第九章&#xff1a;线程池&#xff08;ThreadPool&#xff09; 在第八章《TcpServer》中&#xff0c;我们了解到muduo::net::TcpServer通过EventLoop线程池处理入站连接。 这些EventLoop线程主要负责网络I/O&#xff1a;套接字读写和定时器处理&#xff0c;由Poller和Channel…

【笔记】解决部署国产AI Agent 开源项目 MiniMax-M1时 Hugging Face 模型下载报错解决方案

MiniMax-AI/MiniMax-M1&#xff1a;MiniMax-M1&#xff0c;世界上第一个开放权重、大规模的混合注意力推理模型。 一、问题背景 【笔记】解决部署国产AI Agent 开源项目 MiniMax-M1时 Hugging Face 模型下载缓存占满 C 盘问题&#xff1a;更改缓存位置全流程-CSDN博客 在执行hu…

新手如何利用AI助手Cursor生成复杂项目

新手如何利用AI助手Cursor生成复杂项目 在编程学习的道路上&#xff0c;AI工具正成为新手开发者的得力助手。本文将介绍如何借助Cursor这一强大的AI代码助手&#xff0c;从零开始构建复杂项目。 一、基础准备工作 作为编程新手&#xff0c;面对复杂项目时常常不知从何下手。利…

【Fargo】x264的intra refresh 3: 采集、编码到 RTP打包

实际调试默认并么有打开b_intra_refresh D:\XTRANS\thunderbolt\ayame\zhb-bifrost\player-only\echo\codec\x264\echo_h264_encoder.cpp 即使打开了b_intra_refresh,也不影响RTP打包: 但是有一些要注意的地方: RFC 6184(“RTP Payload Format for H.264 Video”) intra …

Vue3 的生命周期:从 Composition API 视角看

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

面向互联网大厂Java岗位面试:Spring Boot与微服务架构的深入探讨

面向互联网大厂Java岗位面试&#xff1a;Spring Boot与微服务架构的深入探讨 问题1&#xff1a;什么是Spring Boot&#xff0c;它如何简化Spring应用程序的开发&#xff1f; 简洁回答&#xff1a; Spring Boot是一个基于Spring框架的开源Java平台&#xff0c;旨在简化新Sprin…

【信号与系统四】采样和通信系统

在一定条件之下&#xff0c;一个连续时间信号完全可以用该信号在等时间间隔点上的值或样本来表示&#xff0c;并且可以用这些样本值把该信号全部恢复出来。这个稍微有点使人吃惊的性质来自于采样定理。 例如一帧一帧的电影画面&#xff0c;在我们大脑中构成连续的生活情节 接…

关于球面投影SphericalProjector的介绍以及代码开发

球面投影的几何背景 什么是球面投影&#xff1f; 球面投影将 2D 图像中的像素点&#xff08;通常是平面&#xff09;映射到一个虚拟的球面上&#xff0c;再将球面上的角度&#xff08;经度、纬度&#xff09;展开到平面图上。它是广角图像拼接、全景图生成中常用的投影方法。…

wordpress外贸独立站常用留言表单插件 contact form 7

Contact Form 7 介绍 Contact Form 7 是一款非常流行的 WordPress 联系表单插件&#xff0c;广泛应用于外贸独立站。以下是其主要特点&#xff1a; 功能强大且免费&#xff1a;Contact Form 7 是完全免费的&#xff0c;支持创建和管理多个联系表单。 简单易用&#xff1a;用…

佰力博科技与您探讨油浴极化的优点及工艺流程

一、油浴极化的优点 温度范围宽&#xff1a;油浴极化适用于较宽的温度范围&#xff0c;适合不同材料的极化需求。 绝缘强度高&#xff1a;油浴介质具有良好的绝缘性能&#xff0c;能够承受较高的极化电场。 防潮性好&#xff1a;油浴极化在潮湿环境中仍能保持良好的绝缘性能。 …

从0开始学习R语言--Day28--高维回归

我们一般处理的数据&#xff0c;都是样本数量远大于其特征数量&#xff0c;可用很多种回归方法&#xff1b;但当特征数量远大于样本量时&#xff0c;可能会因为出现无数多个完美解导致过拟合现象&#xff0c;也使得在计算时搜索最有特征子集的方法不再可行&#xff08;因为计算…

响应式数据的判断:Vue3中的方法

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

[论文阅读] 人工智能+软件工程 | 用大语言模型架起软件需求形式化的桥梁

用大语言模型架起软件需求形式化的桥梁&#xff1a;一篇ACM调查草案的深度解读 论文信息 arXiv:2506.14627 ACM Survey Draft on Formalising Software Requirements with Large Language Models Arshad Beg, Diarmuid O’Donoghue, Rosemary Monahan Comments: 22 pages. 6 s…

DM8故障分析工具-AWR报告

在数据库运维过程中&#xff0c;大家都会利用数据库提供的各种工具来找到数据库存在的问题&#xff0c;以便对症实施配置优化&#xff0c;我是因工作需要&#xff0c;最近开始了解达梦数据库DM8的故障分析工具&#xff0c;这里发现AWR报告是一款不错的自带工具&#xff0c;故而…

《企业司法风险监控系统架构设计:从数据采集到T+1实时预警的完整解决方案》

本文深入探讨了天远大数据在构建企业级司法风险监控平台和风险报告查询系统方面的技术实现与业务应用。平台依托权威、合法的司法数据源&#xff0c;通过实时数据处理与智能分析&#xff0c;为金融、供应链、人力资源等领域提供精准、及时的司法预警和决策支持。它通过灵活的多…

使用ccs生成bin

CCS12.6 编译生成BIN文件正确方法_ccs生成bin文件-CSDN博客

Kafka网络模块全链路源码深度剖析与设计哲学解读

在分布式消息系统的竞技场上&#xff0c;Kafka凭借卓越的高性能与高吞吐量脱颖而出&#xff0c;而其网络模块正是支撑这一卓越表现的核心引擎。从生产者将消息送入消息队列&#xff0c;到消费者从中拉取消息&#xff0c;Kafka网络模块贯穿消息流转的每个环节。本文不仅深入Kafk…