首页 > 其他 > 详细

LC-593 验证正方形

时间:2019-01-24 14:15:24      阅读:150      评论:0      收藏:0      [点我收藏+]

问题:

给出4个点,判断这四个点能否构成一个正方形

 

思路:

一个正方形意味着4条边相等,四个角都为直角。我就简单地先计算p1到p2,p3,p4的三个向量,然后判断向量v2,v3,v4之间,有哪两个向量是垂直的(点积等于0)。

找出2个垂直向量之后(例如v2,v3),就判断这两个向量的长度是否相等,而且这两个向量与剩下的一个向量(v4)是否构成勾股定理。

最后,再根据向量的减法,求出剩下的点到这两个点的向量(v4 - v2和v4 - v3)与两向量(v2, v3)是否分别垂直。

这样,就可以确保有三个角是直角,而且线段相等,且对角线符合勾股定理。

这种方法的运行时间是0ms噢。

 

代码:

 1 class Solution {
 2 public:
 3     bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
 4         int v2[2], v3[2], v4[2];
 5         v2[0] = p1[0] - p2[0];
 6         v2[1] = p1[1] - p2[1];
 7         v3[0] = p1[0] - p3[0];
 8         v3[1] = p1[1] - p3[1];
 9         v4[0] = p1[0] - p4[0];
10         v4[1] = p1[1] - p4[1];
11         int d2 = pow(v2[0], 2) + pow(v2[1], 2);
12         int d3 = pow(v3[0], 2) + pow(v3[1], 2);
13         int d4 = pow(v4[0], 2) + pow(v4[1], 2);
14         if (d2 == 0 || d3 == 0 || d4 == 0) return false;
15         if (v2[0] * v3[0] + v2[1] * v3[1] == 0) {
16             if (d2 == d3 && d2 + d3 == d4) {
17                 int dot1 = (v4[0] - v2[0]) * v2[0] + (v4[1] - v2[1]) * v2[1];
18                 int dot2 = (v4[0] - v3[0]) * v3[0] + (v4[1] - v3[1]) * v3[1];
19                 if (dot1 == 0 && dot2 == 0)
20                     return true;
21             }
22         }
23         else if (v2[0] * v4[0] + v2[1] * v4[1] == 0) {
24             if (d2 == d4 && d2 + d4 == d3) {
25                 int dot1 = (v3[0] - v2[0]) * v2[0] + (v3[1] - v2[1]) * v2[1];
26                 int dot2 = (v3[0] - v4[0]) * v4[0] + (v3[1] - v4[1]) * v4[1];
27                 if (dot1 == 0 && dot2 == 0)
28                     return true;
29             }
30         }
31         else if (v3[0] * v4[0] + v3[1] * v4[1] == 0) {
32             if (d3 == d4 && d3 + d4 == d2) {
33                 int dot1 = (v2[0] - v3[0]) * v3[0] + (v2[1] - v3[1]) * v3[1];
34                 int dot2 = (v2[0] - v4[0]) * v4[0] + (v2[1] - v4[1]) * v4[1];
35                 if (dot1 == 0 && dot2 == 0)
36                     return true;
37             }
38         }
39         return false;
40     }
41 };

 

LC-593 验证正方形

原文:https://www.cnblogs.com/leo-lzj/p/10314027.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!