Problem 177

http://projecteuler.net/index.php?section=problems&id=177
対称性のチェックが大変。
素直な全探索なのでjavaにした。
賢い探索もあるみたいだが、やはり対称性の除外が面倒そう。

public class P177{
    public static void main(String[] args){
        int count=0;
        double[] sin = new double[180],cos = new double[180];
        for(int i=0; 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);
    }
}