LC-593 验证正方形

Posted leo-lzj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LC-593 验证正方形相关的知识,希望对你有一定的参考价值。

问题:

给出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 验证正方形的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES在android上画一个正方形

CSS中的媒体片段URI替代方案?

c_cpp 快速代码片段,用于在统计(阻止)/ dev / rdsk中的设备时验证fstat64和stat64的行为。

教程4 - 验证和权限

[LeetCode] Valid Square 验证正方形

21个常用代码片段