华为OD-计算正方形数量

发布于:2024-12-22 ⋅ 阅读:(15) ⋅ 点赞:(0)

华为OD-计算正方形数量

题目

在这里插入图片描述

解题思路

由于是构成正方形 再结合用例1 很容易直接写出第一行代码

	const pointCount = await readline();
    if (pointCount < 4) {
        console.log(0);
        return;
    }

在这里插入图片描述

然后就是典型的数学题,什么才能构成正方形(这题题主不会,看了解析之后才恍然通透)直接揭秘
以用例2为🌰

在这里插入图片描述
这里拿前两个点做文章也就是0 0, 1 2
在这里插入图片描述
如果要以这两个点形成正方形,那么只能有两种可能
在这里插入图片描述
那么(0,0)和(2,1)所“期望”的点组是(3,-1)(1,-2)和(1,3)(-1,2)
可以很容易推算出期望点组1的位置是(点1x坐标值+y轴偏移量,点1y坐标值-x偏移量) (点2x坐标值+y轴偏移量,点2y坐标值-x偏移量)

(点1x坐标值+y轴偏移量,点1y坐标值-x偏移量) = (0 + 1,0 - 2) = (-1, -1)
(点2x坐标值+y轴偏移量,点2y坐标值-x偏移量) = (2 + 1,1 - 2) = (3, -1)

期望点组2的位置是(点1x坐标值-y轴偏移量,点1y坐标值+x偏移量) (点2x坐标值-y轴偏移量,点2y坐标值+x偏移量)

(点1x坐标值-y轴偏移量,点1y坐标值+x偏移量) = (0 - 1,0 + 2) = (-1, 2)
(点2x坐标值-y轴偏移量,点2y坐标值+x偏移量) = (2 - 1,1 + 2) = (1, 3)

所以我们只需要确认我们初始的输入内有(3,-1)(1,-2)或者(-1,2)(1,3)就一定能组成正方形!
算法思路 遍历初始化输入的点组,每两个点为一组,找到他们的期望点组,如果存在于初始输入,则结果+1.最后输出/4.
这里解释一下为什么要/4,还是以上面的为🌰.
我们初始化输入(0,0)(1,2)(3,-1)(1,-2)对应图中的A,B,E,F点,以A,B点为起点可以找到EF点,结果+1,但是BF可以找到AE组成正方形,FE可以找到AB,EA可以找到BF.所以最后的结果是实际结果的4倍(对应正方形的四条边)

源码实现

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    const pointCount = await readline();
    if (pointCount < 4) {
        console.log(0);
        return;
    }
    let index = 0;
    const pointPositionList = [];
    do {
        const pointPosition = (await readline()).split(" ");
        pointPositionList.push(pointPosition.map(Number).join(' '));
        index++;
    } while (index < pointCount);


    // 用一个数组来保存已经找出的所有正方形
    const squareCountList = [];

    let squareCount = 0


    for (let i = 0; i < pointCount; i++) {
        for (let j = i + 1; j < pointCount; j++) {
            const position_1 = pointPositionList[i].split(' ').map(Number);
            const position_2 = pointPositionList[j].split(' ').map(Number);
            // 任意两点的X轴偏移量

            const transformX = position_1[0] - position_2[0];
            // 任意两点的Y轴偏移量
            const transformY = position_1[1] - position_2[1]
            // console.log(transformX, transformY)
            // 期望点坐标1
            const expectPoint_1 = `${position_1[0] + transformY} ${position_1[1] - transformX}`
            
          
            // 期望点坐标2
            const expectPoint_2 = `${position_2[0] + transformY} ${position_2[1] - transformX}`
            // 期望点坐标3
            const expectPoint_3 = `${position_1[0] - transformY} ${position_1[1] + transformX}`
            // 期望点坐标4
            const expectPoint_4 = `${position_2[0] - transformY} ${ position_2[1] + transformX}`
            // console.log('期望点组2', expectPoint_3, expectPoint_4)
            if(pointPositionList.includes(expectPoint_1) && pointPositionList.includes(expectPoint_2)){
                squareCount ++
            }

            if(pointPositionList.includes(expectPoint_3) && pointPositionList.includes(expectPoint_4)){
                squareCount ++
            }

        }
    }

    console.log(squareCount / 4);
})();