华为OD E卷(100分)43-构成正方形的数量

前言

工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。

题目描述

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

输入

第一行输入为N,N代表坐标数量,N为正整数。N <= 100

之后的 K 行输入为坐标x y以空格分隔,x,y为整数,-10<=x, y<=10

输出

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

示例

示例1

输入

3

1 3

2 4

3 1
输出

0
说明:(3个点不足以构成正方形)

示例2

输入

4

0 0

1 2

3 1

2 -1
输出

1

解题思路

根据两点计算组成正方形的另外两个点在不在数组内。

题解

Java实现

java 复制代码
package huawei.e100;

import java.util.Scanner;

/**
* @author arnold
* @date 2024年12月31日
* 构成正方形的数量

*/
public class T43 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			int n = sc.nextInt();
			int[][] data = new int[n][2];
			for (int i = 0; i < data.length; i++) {
				data[i][0] = sc.nextInt();
				data[i][1] = sc.nextInt();
			}
			int res = run(data);
			System.out.println(res);
		}
	}
		
	static int run(int[][] data) {
		int res = 0;
		if(data.length >= 4) {
			for (int i = 0; i < data.length-1; i++) {
				for (int j = i+1; j < data.length; j++) {
					int y1 = data[j][1]-(data[j][0] - data[i][0]);
					int x1 = data[j][0]+(data[j][1] - data[i][1]);
					
					int y2 = data[i][1]-(data[j][0] - data[i][0]);
					int x2 = data[i][0]+(data[j][1] - data[i][1]);
					//如果坐标点中包含这两个坐标,则能形成正方形。
					int has = 0;
					for (int k = 0; k < data.length; k++) {
						if((data[k][0] == x1 && data[k][1] == y1) || (data[k][0] == x2 && data[k][1] == y2)) {
							has++;
						}
					}
					if(has == 2) {
						res++;
					}
					// 第二种可能
					int y3 = data[j][1]+(data[j][0] - data[i][0]);
					int x3 = data[j][0]-(data[j][1] - data[i][1]);
					
					int y4 = data[i][1]+(data[j][0] - data[i][0]);
					int x4 = data[i][0]-(data[j][1] - data[i][1]);
					//如果坐标点中包含这两个坐标,则能形成正方形。
					has = 0;
					for (int k = 0; k < data.length; k++) {
						if((data[k][0] == x3 && data[k][1] == y3) || (data[k][0] == x4 && data[k][1] == y4)) {
							has++;
						}
					}
					if(has == 2) {
						res++;
					}
				}
			}
		} 
		// 同一个正方形会计算4次
		return res/4;
	}

}
相关推荐
熬了夜的程序员7 天前
【华为机试】208. 实现 Trie (前缀树)
数据结构·算法·华为od·华为
哪 吒15 天前
【2025C卷】华为OD机试九日集训第3期 - 按算法分类,由易到难,提升编程能力和解题技巧
python·算法·华为od·华为od机试·2025c卷
熬了夜的程序员17 天前
【华为机试】34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·华为od·华为·面试·golang
哪 吒1 个月前
【2025B卷】华为OD机试九日集训第2期 - 按算法分类,由易到难,提升编程能力和解题技巧(Python/JS/C/C++)
python·算法·华为od·华为od机试·2025b卷
蜗牛的旷野1 个月前
华为OD机试_2025_查找单入口空闲区域(Python,100分)(附详细解题思路)
python·算法·华为od
_不会dp不改名_1 个月前
华为OD 二维伞的雨滴效应
华为od
_不会dp不改名_1 个月前
华为OD 数字游戏
华为od
YOLO大师1 个月前
华为OD机试 2025B卷 - 小明减肥(C++&Python&JAVA&JS&C语言)
c++·python·华为od·华为od机试·华为od2025b卷·华为机试2025b卷·华为od机试2025b卷
哪 吒1 个月前
2025B卷 - 华为OD机试七日集训第5期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
python·算法·华为od·华为od机试·2025b卷
蜗牛的旷野2 个月前
华为OD机试_2025 B卷_矩形相交的面积(Python,100分)(附详细解题思路)
开发语言·python·华为od