http://projecteuler.net/index.php?section=problems&id=177

対称性のチェックが大変。

素直な全探索なのでjavaにした。

賢い探索もあるみたいだが、やはり対称性の除外が面倒そう。

public class P177{
public static void main(String[] args){
int count=;
double[] sin = new double[180],cos = new double[180];
for(int i=; i<180; sin[i]=Math.sin(Math.toRadians(i)),cos[i]=Math.cos(Math.toRadians(i++)));
for(int alpha = 2;alpha<=90;alpha++)
for(int diagB = 1; diagB< 180-alpha ; diagB++){
double ad = sin[diagB]/sin[alpha+diagB];
for(int beta = Math.max(alpha,diagB+1); beta <= 180-alpha ; beta++)
for(int diagA = beta==alpha?diagB:1 ; diagA < Math.min(alpha,180-beta); diagA++){
double ac = sin[beta]/sin[beta+diagA];
double x = Math.toDegrees(Math.atan2(sin[diagA]*ac-sin[alpha]*ad,cos[diagA]*ac-cos[alpha]*ad));
int rx = (int)Math.round(x);
int delta = 180-alpha+rx, gamma = 180-beta-rx;
if(gamma < alpha) break;
if(delta < beta) continue;
if((beta==delta)&&(diagA > alpha/2)) continue;
if((gamma==alpha)&&(diagB > beta/2)) continue;
if(Math.abs(x-rx) < 1.0E-10)count++;
}
}
System.out.println(count);
}
}