読者です 読者をやめる 読者になる 読者になる

AOJ0016:Treasure Hunt

英語の勉強で発音の問題をやっていたら、発音以前に単語が分からない。そんな辛さの中の息抜きで1問。

問題概要

(0,0)をy軸正の向きでスタートして、移動と方向転換を繰り返し、最終的にいる座標を求める問題。
Treasure Hunt | Aizu Online Judge

解法

素直にシミュレーション。角度は必ず整数で与えられるので、最初から何度回ったのかを整数で保存しておき、使う時だけ/180*M_PIしてあげればいいと思う。

#include <bits/stdc++.h>
using namespace std;
int flr(double x){
	if(x<0)	return ceil(x);
	else 	return floor(x);
}
int main(){
	double x=0,y=0;
	int arg=90;
	while(true){
		int d,a;	scanf("%d,%d",&d,&a);
		if(d==0&&a==0)	break;
		double args=(arg)/180.0*M_PI;
		x+=d*cos(args);	y+=d*sin(args);
		arg-=a;
	}
	printf("%d\n",flr(x));
	printf("%d\n",flr(y));
	return 0;
}
感想

普通に解けるんだけど、これ解いててC++は小数点以下を丸めるとき、普通では値が必ず小さくなるよう丸めることを思い出した。Pythonとかなら絶対値が小さくなるよう丸めるから特に考えることもなく通せたんだけど。
そういえば今日20:00からCodeforcesです。出ましょう。