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);
}