パソコン甲子園 2003 問題 019
2006.07.06 14:44 パソコン甲子園
[問題]
昨年他界した曽祖父の遺品を整理していたところ、次のような紙がでてきました。

紙の裏には「最初の数だけ前に進んで、次の数の角度だけ右にまわる(負の数は左にまわる)、それ以降はその繰り返し」とメモがしてあります。祖母によれば「三本松」は、町のちょうど中心にあったそうです。しかし、今はビルや家が立ち並んでいて、ここに書いてあるとおりに歩くことはできません。地図の上で宝のある場所を探してください。
1 歩は 1m だとします。入力データは、進む歩数と回転する角度を書いた行が並んでいて、最後に「0,0」という行があります。最後まで指示どおりに歩いたときに着いた場所を「街の中心から東へ x m, 北へ y m 」のように測り、その x と y を表示して終了するプログラムを作成して下さい。西および南の場合は x, y は負の値となります。x, y ともに整数部を表示して下さい。
[入力]
歩数(100以下の正の整数) 回転角度(-180 以上 180 以下の整数)が半角カンマ区切りで与えられます。
[出力]
x, y をそれぞれ1行に出力して下さい。
[入力例]
56,65 97,54 64,-4 55,76 42,-27 43,80 87,-86 55,-6 89,34 95,5 0,0
[出力例]
171 -302
[解説]
与えられる入力は、現在地から進む距離 length と、"次のステップでの角度"を計算するための angle であることに注意しましょう。また、与えられる角度の単位は度(degree)なので、三角関数を使う場合はラジアンに変換する必要があります。

[プログラム例]
// @author yutaka C++ #include<stdio.h> #include<cmath> #define PI 3.14159265358979323846 using namespace std; int length, angle, currentAngle; double px, py; void walk(){ px += length * cos(currentAngle * PI / 180.0); py += length * sin(currentAngle * PI / 180.0); currentAngle -= angle; } main(){ px = py = 0; currentAngle = 90; while (1){ scanf("%d,%d", &length, &angle); if ( length == 0 && angle == 0 ) break; walk(); } printf("%d\n%d\n", (int)px, (int)py); }
| コメント(0) | トラックバック(0) | ↑ページトップ |