CodeIQ 挑戦の記録 : 今週のアルゴリズム : 第103回「まわり将棋に挑戦!」

CodeIQというサイトで問題に挑戦した記録です。

問題文を要約すると下記の通り

  • まわり将棋を考える
    (まわり将棋とは金将4つをサイコロの代わりに使い、9x9マスの将棋盤の周囲を双六の様にコマを進めるゲームである)
  • 振った金将の状態により金将1つあたり下記の得点が得られる。4つの合計が進むマスの数となる。
    ・裏向き:0
    ・表向き:1
    ・横向き:5
    ・上向き:10
    ・下向き:20
  • あるコマが角の位置からスタートした時、n回振って4つの角の内どこかの角にいるパターンが何通りかを解答する。
  • コマの動きは動くマスの数のみに着目する。並び順は区別する。
    例えば n=2 のとき、「1回目に3マス、2回目に5マス」動いたときと、「1回目に5マス、2回目に3マス」動いた場合は別々とカウントする。
  • nの最大は7

方針

メモ化再帰により探索する。
金将4つの得点の合計が1回に進むマスの数になり、これのn回の和が進んだマスの数。
9x9マスの周囲を回るので、角からスタートすれば、進んだ数が8の倍数であればどこかの角にいる事になる。

実装としては、あらかじめ金将4つの得点の合計の組み合わせ
{0,1,5,10,20}の中から4つを選んだ組み合わせの和を計算し、配列に記録しておく。
n回コマを振った場合に進む、全てのコマ数の組み合わせをメモ化再帰で試し、合計が8の倍数になるものを数え解答とする。

実装(Ruby)

では、


Sponsored Link