AOJ 0016 Treasure Hunt

リンク AOJ 0016 Treasure Hunt

方針

次に移動する点は、これから歩く距離を半径とした円周上の点であり、角度もわかっているのでsinとcosを使えば求めることができます。
ただし、

  • 与えられる角度は原点からの角度ではなく、現在地点からの角度であること。
    • つまり、原点からの角度で保持するためには、今までの角度の合計を保持しておかないといけない。
  • いままでの角度の合計が負の角度になった場合、360を加える必要があるということ。
    • 例:-10°は350°と等しいので、350 = -10 + 360
  • いままでの角度の合計が360°を超えた場合、360で割る必要があるということ。
    • 例:380°は20°と等しいので、20 = 380 mod 360

気に食わないこと

X座標はcosだろjk…何故かこれで通ってしまった。
cosとsinはラジアン角で表記するために、angle*Math.PI/180としてラジアンへ変換したけど、これがおかしくて反周期ずれた?
でも90°は\frac{\pi}{2}90 \div 180 \times \piだしなぁ・・・

ソース

import java.util.*;
public class Main {
    static Scanner sc = new Scanner(System.in);
    static double X, Y, r, angle, an;
    static String[] input;
    public static void main(String[] args) {
        while(read()){
            solve();
        }
        System.out.println((int)X);
        System.out.println((int)Y);
    }

    static boolean read(){
        input = sc.next().split(",");
        r = Integer.parseInt(input[0]);
        an = Integer.parseInt(input[1]);
        if(r == 0 && an == 0)return false;
        return true;
    }

    static void solve(){
        X = X + r*Math.sin(angle*Math.PI/180);
        Y = Y + r*Math.cos(angle*Math.PI/180);
        if(angle < 0)angle = angle + 360;
        angle = (angle + an)%360;
    }

}