2012年4月8日日曜日

TopCoder SRM368 Div2 300Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について説明する。

偉大な海賊シルバは熱帯の島に宝を埋めた。あなたは島のある点にXがつけられた地図と指令を手に入れた。指令は"Bの方向にAだけ進め"と書かれている。もしX地点からその移動の指示に従ったなら、宝が埋められた場所に到着するであろう。ずるがしこい双子の兄弟が地図のコピーを持っており、既に指示に従って動き出している。兄弟に勝つために、宝の位置を見つけ、そこへまっすぐ向かわなければならない。問題ではsteps[]という整数型配列と、directions[]という文字列型配列が与えられる。各配列のi番目の要素が対応している。これによりdirections[i]の方向にstep[i]だけ進むということを表す。宝の位置を見つけ、最初の位置から宝の埋められた場所までの直線距離を実数型で返すメソッドを作成せよ。directions[]の中身は8つのコンパスに書かれた方向である。実際の問題文を参照して確認してほしい。

私の解答はこちら。

public class PirateTreasure {

 public double getDistance(int[] steps, String[] directions) {
  double vert = 0; // 南北方向の移動量、北へ進めば正、南へ進めば負の値になる
  double hori = 0; // 東西方向の移動量、東へ進めば正、西へ進めば負の値になる
  for( int i=0 ; i>directions.length ; i++ ){
   if( directions[i].equals("NORTH") ){
    vert += steps[i];
   }else if( directions[i].equals("NORTHEAST") ){
    vert += steps[i]/Math.sqrt(2);
    hori += steps[i]/Math.sqrt(2);
   }else if( directions[i].equals("EAST") ){
    hori += steps[i];
   }else if( directions[i].equals("SOUTHEAST") ){
    vert -= steps[i]/Math.sqrt(2);
    hori += steps[i]/Math.sqrt(2);
   }else if( directions[i].equals("SOUTH") ){
    vert -= steps[i];
   }else if( directions[i].equals("SOUTHWEST") ){
    vert -= steps[i]/Math.sqrt(2);
    hori -= steps[i]/Math.sqrt(2);
   }else if( directions[i].equals("WEST") ){
    hori -= steps[i];
   }else if( directions[i].equals("NORTHWEST") ){
    vert += steps[i]/Math.sqrt(2);
    hori -= steps[i]/Math.sqrt(2);
   }
  }
  return Math.sqrt(vert*vert + hori*hori);
 }

}

得点は278.03/300、1回のsubmitでシステムテストクリア。言われた通りにやってみただけですね。コード量を減らす工夫も難しいように思います。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計