このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。画像があるので、必要に応じて本文を見て欲しい。
"4Blocks"は、特別な盤で二人のプレーヤーが協調するゲームである。盤は1*1の正方形のセルからなる格子である。格子は高さが2である。2種類の異なるブロックがある。1と4というブロックである。1は1*1、4は2*2のサイズである。あなたはブロックを辺が格子の辺に沿うように配置し、二つのブロックが重ならないようにしなければならない。最終スコアは各セルにある値の和である。1は1ポイントの価値があり、4は、セルが4つを各セルが4ポイントの価値で覆われることから、16ポイントの価値がある。あなたの友人は自分の番で盤に1のブロックをいくつか置く。現在の設定はgrid[]という文字列型配列で与えられる。i番目の文字列のj番目の要素はi行j列の上京を表しており、"."であれば空、"1"であれば、友人が1をそのセルに置いたということになる。あなたの番がやってきて、1と4のブロックを置くことができるが、既に置かれたブロックは除去できないものとする。 達成可能な点数の最高点を返せ。
私の解答はこちら。
public class FourBlocksEasy { public int maxScore(String[] grid) { int score = 0; int hPos = 0; // 現在注目する位置(ここと下、右、右下に注目する) int width = grid[0].length(); // 盤面の横幅 while( true ){ if( hPos >= width ) break; // 右端まで見たら終了 if( grid[0].charAt(hPos) == '.' && grid[1].charAt(hPos) == '.' ){ if( hPos == width-1 ){ // 右端まで来ていたら1を上下に置いて終了 score += 2; break; } if( grid[0].charAt(hPos+1) == '.' && grid[1].charAt(hPos+1) == '.' ){ score += 16; // 2*2のスキマがあるので4のブロックを置ける hPos += 2; }else{ // そうでなければ、1のブロックを上下において一つ右へ進める // 4足して二つ右に進めても良かったですね... score += 2; hPos++; } }else{ // 上下のどちらかに1が既に埋まっていた場合 score += 2; hPos++; } } return score; } }
得点は233.05/250、1回のsubmitでシステムテストクリア。左から順に4が置けるかチェックしていくだけでOK。
0 件のコメント:
コメントを投稿