fc2ブログ



パソコン甲子園 2003 問題 019

2006.07.06 14:44  パソコン甲子園

[問題]
昨年他界した曽祖父の遺品を整理していたところ、次のような紙がでてきました。

treasure.gif

紙の裏には「最初の数だけ前に進んで、次の数の角度だけ右にまわる(負の数は左にまわる)、それ以降はその繰り返し」とメモがしてあります。祖母によれば「三本松」は、町のちょうど中心にあったそうです。しかし、今はビルや家が立ち並んでいて、ここに書いてあるとおりに歩くことはできません。地図の上で宝のある場所を探してください。

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)なので、三角関数を使う場合はラジアンに変換する必要があります。

treasure2.gif

[プログラム例]

// @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) | ↑ページトップ |

この記事へのコメント

コメントを書く


管理人にのみ表示

↑ページトップ

この記事へのトラックバック

この記事にトラックバックする(FC2ブログユーザー)

↑ページトップ