题目
解题思路
由于是构成正方形 再结合用例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);
})();