Cod sursa(job #1551486)

Utilizator bolovMihail Balan bolov Data 15 decembrie 2015 22:24:22
Problema Triang Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cmath>

#include <fstream>
#include <vector>

struct Point {
  double x, y;
};

static auto get_square_dist(Point const &p1, Point const &p2) -> double {
  return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
}

static auto are_equal_epsilon(double a, double b) -> bool {
  static auto const epsilon = 0.001;
  return std::abs(a - b) < epsilon;
}

static auto form_equilateral_triangle(Point const &p1, Point const &p2,
                                      Point const &p3) -> bool {
  auto d12 = get_square_dist(p1, p2);
  auto d23 = get_square_dist(p2, p3);

  return are_equal_epsilon(d12, d23) &&
         are_equal_epsilon(d12, get_square_dist(p1, p3));
}

auto main() -> int {
  std::ifstream fin{"triang.in"};
  auto points = std::vector<Point>();

  // read
  auto n = int{};
  fin >> n;
  auto const size = n;
  points.reserve(size);

  for (auto i = 0; i < size; ++i) {
    Point p;
    fin >> p.x >> p.y;
    points.emplace_back(p);
  }
  fin.close();

  // naive solution
  auto num = 0;
  for (auto i = 0; i < size - 2; ++i) {
    for (auto j = i + 1; j < size - 1; ++j) {
      for (auto k = j + 1; k < size; ++k) {
        if (form_equilateral_triangle(points[i], points[j], points[k])) {
          ++num;
        }
      }
    }
  }

  std::ofstream fout("triang.out");
  fout << num;

  return 0;
}