zoukankan      html  css  js  c++  java
  • hihoCoder#1040 矩形判断

    原题地址

    一开始写了一个求交点然后算角度的,特别复杂不说,还很容易出错,WA了很久也不知道错在哪

    后来想想,应该用向量做

    四条直线能围成一个矩形 <=> 四条直线两两之间有4个平行关系,8个垂直关系

    注意,直线重合并不算平行

    代码清晰明了,一遍AC,这酸爽。

    代码:

     1 #include <iostream>
     2 #include <vector>
     3 
     4 using namespace std;
     5 
     6 struct Line {
     7   int x[2];
     8   int y[2];
     9   Line(int x1, int y1, int x2, int y2) {
    10     x[0] = x1;
    11     x[1] = x2;
    12     y[0] = y1;
    13     y[1] = y2;
    14   }
    15   int vx() {return x[0] - x[1];}
    16   int vy() {return y[0] - y[1];}
    17 };
    18 
    19 bool parallelp(Line &a, Line &b) {
    20   return a.vx() * b.vy() - b.vx() * a.vy() == 0;
    21 }
    22 
    23 bool samep(Line &a, Line &b) {
    24   Line c(a.x[0], a.y[0], b.x[0], b.y[0]);
    25   return parallelp(a, c);
    26 }
    27 
    28 bool verticalp(Line &a, Line &b) {
    29   return a.vx() * b.vx() + a.vy() * b.vy() == 0;
    30 }
    31 
    32 int parallel_count(vector<Line> &lines) {
    33   int res = 0;
    34 
    35   for (int i = 0; i < 4; i++) {
    36     for (int j = 0; j < 4; j++) {
    37       if (i == j)
    38         continue;
    39       if (parallelp(lines[i], lines[j]) && !samep(lines[i], lines[j]))
    40         res++;
    41     }
    42   }
    43 
    44   return res;
    45 }
    46 
    47 int vertical_count(vector<Line> &lines) {
    48   int res = 0;
    49 
    50   for (int i = 0; i < 4; i++) {
    51     for (int j = 0; j < 4; j++) {
    52       if (i == j)
    53         continue;
    54       if (verticalp(lines[i], lines[j]))
    55         res++;
    56     }
    57   }
    58 
    59   return res;
    60 }
    61 
    62 bool rectanglep(vector<Line> &lines) {
    63   int p_count = parallel_count(lines);
    64   int v_count = vertical_count(lines);
    65   return p_count == 4 && v_count == 8;
    66 }
    67 
    68 int main() {
    69   int n;
    70   double x1, y1, x2, y2;
    71 
    72   cin >> n;
    73   while (n--) {
    74     vector<Line> lines;
    75     for (int i = 0; i < 4; i++) {
    76       cin >> x1 >> y1 >> x2 >> y2;
    77       lines.push_back(Line(x1, y1, x2, y2));
    78     }
    79 
    80     if (rectanglep(lines))
    81       cout << "YES" << endl;
    82     else
    83       cout << "NO" << endl;
    84   }
    85   return 0;
    86 }
  • 相关阅读:
    DDD之3实体和值对象
    DDD之2领域概念
    DDD之1微服务设计为什么选择DDD
    SOFA入门
    COLA的扩展性使用和源码研究
    kafka可插拔增强如何实现?
    请设计一个核心功能稳定适合二开扩展的软件系统
    如何保证kafka消息不丢失
    kafka高吞吐量之消息压缩
    kafka消息分区机制原理
  • 原文地址:https://www.cnblogs.com/boring09/p/4364403.html
Copyright © 2011-2022 走看看