Run Time: 0.070
Ranking (as of 2016-07-26): 118 out of 643
Language: C++
/* UVa 209 - Triangular Vertices To build using Visual Studio 2012: cl -EHsc -O2 UVa_209_Triangular_Vertices.cpp */ #include <algorithm> #include <iostream> #include <string> #include <sstream> #include <cstdlib> #include <cmath> using namespace std; const int nr_points_max = 6; struct point { int r_, c_; bool operator<(const point& p) const {return (r_ != p.r_) ? r_ < p.r_ : c_ < p.c_;} bool operator==(const point& p) const {return r_ == p.r_ && c_ == p.c_;} } points[nr_points_max]; void get_point(int n, point& p) { int r = static_cast<int>((sqrt(1.0 + 8.0 * n) - 1.0) / 2.0); if (r * (r + 1) / 2 < n) r++; p.r_ = r; p.c_ = n - (r - 1) * r / 2; } int get_length(const point& p, const point& q) { if (p.r_ == q.r_) return abs(p.c_ - q.c_); else if (p.c_ == q.c_) return abs(p.r_ - q.r_); else if (p.c_ - q.c_ == p.r_ - q.r_) return abs(p.r_ - q.r_); else return -1; } bool is_triangle() { int a = get_length(points[0], points[1]), b = get_length(points[1], points[2]), c = get_length(points[2], points[0]); return a > 0 && a == b && b == c; } bool is_parallelogram() { int a = get_length(points[0], points[1]), b = get_length(points[2], points[3]), c = get_length(points[0], points[2]), d = get_length(points[1], points[3]); return a > 0 && a == b && b == c && c == d; } bool is_hexagon() { if (points[0].r_ != points[1].r_) return false; int a = points[1].c_ - points[0].c_; if (points[0].c_ != points[2].c_ || a != points[2].r_ - points[0].r_) return false; if (points[3].c_ > points[1].c_ && points[3].c_ - points[1].c_ == points[3].r_ - points[1].r_ && points[3].c_ - points[1].c_ == a) ; else return false; if (points[4].c_ > points[2].c_ && points[4].c_ - points[2].c_ == points[4].r_ - points[2].r_ && points[4].c_ - points[2].c_ == a) ; else return false; if (points[3].c_ != points[5].c_ || a != points[5].r_ - points[3].r_) return false; if (points[4].r_ != points[5].r_ || points[5].c_ - points[4].c_ != a) return false; return true; } int main() { string s; while (getline(cin, s)) { istringstream iss(s); int p, nr_points = 0; for ( ; iss >> p; nr_points++) { cout << p << ' '; get_point(p, points[nr_points]); } bool acceptable = false; sort(points, points + nr_points); int nr_unique = unique(points, points + nr_points) - points; if (nr_unique == nr_points && (nr_points == 3 || nr_points == 4 || nr_points == 6)) { #ifdef DEBUG for (int i = 0; i < nr_points; i++) cout << '(' << points[i].r_ << ',' << points[i].c_ << ") "; cout << endl; #endif if (nr_points == 3) { if (acceptable = is_triangle()) cout << "are the vertices of a triangle\n"; } else if (nr_points == 4) { if (acceptable = is_parallelogram()) cout << "are the vertices of a parallelogram\n"; } else { if (acceptable = is_hexagon()) cout << "are the vertices of a hexagon\n"; } } if (!acceptable) cout << "are not the vertices of an acceptable figure\n"; } return 0; }
No comments:
Post a Comment