AOJ 0582 - Triangle Types
長い.
三角形かは(1辺)>(他の2辺の和)が成り立つか,
鈍角(Obtuse)と鋭角(Acute)は余弦定理を用いて判定した.
#include<iostream> #include<cstdio> #include<algorithm> struct Triangle{ int sides[3]; }; bool checkTriangle(const Triangle& t){ for(int i=0;i<3;i++){ if(t.sides[i] + t.sides[(i+1)%3] <= t.sides[(i+2)%3])return false; } return true; } bool checkRightTriangle(Triangle& t){ std::sort(t.sides, t.sides+3); return (t.sides[0] * t.sides[0] + t.sides[1] * t.sides[1] == t.sides[2] * t.sides[2]); } bool checkObtuseTriangle(Triangle& t){ double cos = 1.0 * (t.sides[0] * t.sides[0] + t.sides[1] * t.sides[1] - t.sides[2] * t.sides[2]) / (2 * t.sides[0] * t.sides[1]); return (cos < 0); } bool checkAcuteTriangle(Triangle& t){ double cos = 1.0 * (t.sides[0] * t.sides[0] + t.sides[1] * t.sides[1] - t.sides[2] * t.sides[2]) / (2 * t.sides[0] * t.sides[1]); return (cos > 0); } int main(){ int a, b, c, tn = 0, rtn = 0, otn = 0, atn = 0; bool ignored = false; while(std::cin >> a >> b >> c, !std::cin.eof()){ if(ignored)continue; Triangle t = {{a, b, c}}; if(checkTriangle(t)){ tn++; if(checkRightTriangle(t))rtn++; if(checkObtuseTriangle(t))otn++; if(checkAcuteTriangle(t))atn++; } else ignored = true; } printf("%d %d %d %d\n", tn, rtn, atn, otn); }