No.459 C-VS for yukicoder
タグ : / 解いたユーザー数 58
作問者 : mai / テスター : tubo28
Note
この問題はAdvent Calendar Contest Advent Calendar 2016の10日目の問題として作られました。
codevsお疲れ様でした!(2016/12/10)
問題文
maiさんはc-vsと呼ばれるゲームAIコンテストに参加しています。
c-vsとは?
高さ$H$幅$W$のフィールドに与えられたパック(高さ3幅3の、少なくとも1つのブロックを含む塊)を落とす、いわゆる「ぷよぷよゲー」です。
連鎖してブロックを消すはずですが、後述の事情により、落とすだけのゲームになっています。
c-vsは、次の流れに従ってゲームが進行します。
- パックが与えられ、プレイヤーは投下位置を決める。
指定出来るのは$0$から$W-3$の範囲の整数で、$0$は左端、$W-3$は右端から2つ左に移動した位置である。回転はできない。 - 決めた投下位置にパックの左端を合わせ、その位置にパックを落下させる。
- ブロックは下に床があるか、積まれたブロックに当たるまで落下する。
- 1から3までの流れを1ターンとする。これを繰り返す。
maiさんは舞葉君とマッチングし、ゲームが開始しました。
しかし、ゲームが開始した瞬間、舞葉君は特殊コマンドを入力したため、フィールドに落ちてくるパックに含まれるブロックが全て黒に塗りつぶされてしまいました。
これでは連鎖してブロックを消すことが出来ません。
maiさんは$i$ターン目のパックの投下位置を$C_i$に指定しました($1 \le i \le N$)。結果、$N$ターン目の3.が終了した時点でのフィールドの状態は$S$でした。
どのようなパックが与えられたのでしょうか?maiさんに与えられた$N$個のパックの中身を求めてください。
入力
$H$ $W$ $N$ $S_1$ $S_2$ ... $S_H$ $C_1$ $C_2$ $...$ $C_N$
以下の制約をすべて同時に満たす。
$3 \le W \le 10000$
$1 \le H \le 10000$
$3 \le H \times W \le 30000$
$1 \le N \le \min \{ H \times W , 30000 \}$
$|S_i| = W$
$S_i$は'.'と'#'から成る文字列で、1つ以上'#'を含む。
$0 \le C_i \le W-3$
数字が与えられるものは全て整数である
フィールドの状態$S$は$H$個の文字列$S_1,S_2,...,S_H$で表現されます。
左から$x$番目、上から$y$番目のフィールドのセルは、文字列$S_y$の左から$x$番目に対応し、
'#'であればそのセルにブロックが存在、'.'であれば空であることを示します。
与えられるフィールドの状態は、題意を満たすゲームの進行によって得られるものに限られます。
出力
パックを次のフォーマットに従って、改行区切りで$N$個出力してください。すなわち、$3 \times N$行出力してください。
上から$i$番目のパックは$C_i$に対応するようにしてください。
パックは3行3文字の文字列で表現されます。
パックの上から$y$番目、左から$x$番目のセルは$y$行$x$文字目に対応し、
そのセルが空ならば'.'、ブロックが存在するならば'#'となります。
問題文にもありますが、全てのパックは必ず1つ以上のブロックを持つことに注意してください。
最後に改行してください。
c++14によるスペシャルジャッジを使用しています。
解は1つとは限りませんが、どの解を出力してもACとなります。
サンプル
サンプル1
入力
4 5 3 ...#. ...#. ..##. #.### 0 2 2
出力例
... #.. ..# ##. .#. ... ..# .#. .#.
出力例は解の1つであり、要件を満たせばこの出力に一致していなくてもACとなります。
サンプル2
入力
3 3 2 ### ### ### 0 0
出力例
... ... #.. .## ### ###
ブロックを持たないパックは出力しないでください。
サンプル3
入力
4 11 5 ....#...... ##.##..##.. ##.###.#### ######.#### 0 2 4 6 8
出力例
##. ##. ##. .## .## ### ... .#. ##. .#. .## .## ... .## ###
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。