AOJ0076 Treasure Hunt II

問題リンク Treasure Hunt II

  • 解法

点(x, y)から次の地点に進むまでの大きさ(dx, dy)を求めれば勝ちです。
原点を中心に(x, y)を反時計回りに90度回転させて(X, Y)とします。
X = x*cos90 - y*sin90 = -y
Y = x*sin90 + x*cos90 = x
です。この(X, Y)ベクトルが次の地点に進むまでの方角です。
あとはこの方角に1m進めばいいので、XとYをベクトルの大きさで割って正規化します。
すなわち
dx = -y/sqrt(x*x+y*y)
dy = x/sqrt(x*x+y*y)
となります。あとはこのサイクルをN-1回繰り返すだけです。

  • ソース
import java.util.Scanner;

//Treasure Hunt II
public class AOJ0076 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(true){
			int n = sc.nextInt();
			if(n==-1)break;
			double x = 1;
			double y = 0;
			for(int i=2;i<=n;i++){
				double d = Math.sqrt(x*x+y*y);
				double dx = -y/d;
				double dy = x/d;
				x+=dx;
				y+=dy;
			}
			System.out.printf("%.2f\n%.2f\n", x, y);
		}
	}
}