AOJ 0016 Treasure Hunt
方針
次に移動する点は、これから歩く距離を半径とした円周上の点であり、角度もわかっているのでsinとcosを使えば求めることができます。
ただし、
- 与えられる角度は原点からの角度ではなく、現在地点からの角度であること。
- つまり、原点からの角度で保持するためには、今までの角度の合計を保持しておかないといけない。
- いままでの角度の合計が負の角度になった場合、360を加える必要があるということ。
- 例:-10°は350°と等しいので、
- いままでの角度の合計が360°を超えた場合、360で割る必要があるということ。
- 例:380°は20°と等しいので、
気に食わないこと
X座標はcosだろjk…何故かこれで通ってしまった。
cosとsinはラジアン角で表記するために、angle*Math.PI/180としてラジアンへ変換したけど、これがおかしくて反周期ずれた?
でも90°はでだしなぁ・・・
ソース
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; } }