题解 | #魔法阵#
魔法阵
http://www.nowcoder.com/practice/04c873db99a34a0c85d476be82533b98
- 要判断四个点是否构成正方形,可以转化为任意三个点是否构成等腰直角三角形。
- 判断等腰直角三角形的思路如下:
- 算出三个点之间的两两直线距离的平方,也即
;
- 然后判断较小的两个值是否相等(等腰),以及较小的两个值之和是否等于第三个值(直角)。
- 算出三个点之间的两两直线距离的平方,也即
const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); let T = undefined; let point1 = Array(2), point2 = Array(2), point3 = Array(2), point4 = Array(2); rl.on('line', function (line) { if(T === undefined) { T = parseInt(line); point1[0] = undefined; point1[1] = undefined; point2[0] = undefined; point2[1] = undefined; point3[0] = undefined; point3[1] = undefined; point4[0] = undefined; point4[1] = undefined; return; } const tokens = line.split(''); if(point1[0] === undefined) { point1[0] = parseInt(line[0]); point2[0] = parseInt(line[1]); point3[0] = parseInt(line[2]); point4[0] = parseInt(line[3]); return; } point1[1] = parseInt(line[0]); point2[1] = parseInt(line[1]); point3[1] = parseInt(line[2]); point4[1] = parseInt(line[3]); if(!judge(point1, point2, point3)) console.log("No"); else if(!judge(point1, point2, point4)) console.log("No"); else if(!judge(point1, point3, point4)) console.log("No"); else if(!judge(point2, point3, point4)) console.log("No"); else console.log("Yes"); if(--T === 0) rl.close() else point1[0] = undefined; }); // 判断三个点是否构成等腰直角三角形 let distance = [0, 0, 0]; function judge(point_1, point_2, point_3) { distance[0] = Math.pow(point_1[0] - point_2[0], 2) + Math.pow(point_1[1] - point_2[1], 2); distance[1] = Math.pow(point_1[0] - point_3[0], 2) + Math.pow(point_1[1] - point_3[1], 2); distance[2] = Math.pow(point_2[0] - point_3[0], 2) + Math.pow(point_2[1] - point_3[1], 2); distance.sort((a, b) => a - b); if( distance[0] === distance[1] && distance[0] + distance[1] === distance[2]) { return true; } else return false; }