京都大学プログラミングコンテスト2015

I - ハウスシャッフル


Time limit時間制限 : 2sec / Memory limitメモリ制限 : 256MB

16:38 入力例の三番目のケースに誤りがありましたので,修正しました.

問題文

ヘンゼルはビスケット,キャンディ,マシュマロの絵の書かれたタイルを使って平面上にお菓子の家を作る遊びをしている.

そこでグレーテルが,お菓子の家を使ったゲームを提案した.

ゲームの内容は以下のとおりである.

以下は,N = 7 のときのお菓子の絵の例とその座標である.

以上のゲームを複数回行う. この問題の目的は,ヘンゼル役のAIプログラムを作成し, ジャッジ側の用意したグレーテル役のAIプログラムと対戦をして, 全てのゲームに勝つことである.


入出力

初めの入力は以下の一行のみで与えられる.

N

N (6 \leq N \leq 200) はお菓子の家の大きさを表す整数である.

この入力の後に,解答プログラムはお菓子の家を表す文字列を, マシュマロを o ,キャンディを @ , ビスケットを # として出力せよ. お菓子の家の上から i 段目を,長さ i の文字列 s_i として以下の形式で出力すること. 各行の先頭には空白を入れず横詰めで出力し,末尾には改行を出力せよ.

s_1
:
s_N

次に,シャッフル後のお菓子の家を表す文字列が同じ形式で与えられる. その後,順列 σ を空白区切りで以下のような形式で出力すること. 出力の後には改行を出力せよ.

σ_1 ... σ_N

この後,すぐに次のゲームがはじまり, 次のゲームのお菓子の家の大きさを表す整数が入力として与えられる. 全てのゲームが終了すると,お菓子の家の大きさを表す整数の代わりに 0 が入力として与えられるので,それを受け取ったら即座にプログラムを終了すること. なお,ひとつの入力で行われるゲームの回数は多くとも 10 回である.

各出力の後には,出力をフラッシュする必要があることに注意せよ.例えば C/C++ では

scanf("%d", &N);

としてお菓子の家のサイズNを受け取り, これに対して文字列s

printf("%s\n", s); fflush(stdout);

と出力すればよい. グレーテル役のAIプログラムから与えられる入力は最後まで受け取ること.受け取らなかった場合,Time Limit Exceeded の結果が得られることがあるため,注意すること.

部分点

以下の制約を満たすデータセットに全て正解した場合は 3 点の部分点が与えられる.


入出力例

以下の入力例では N = 4 の場合について示しているが,このような入力は与えられないことに注意せよ.

手番 プログラムの出力 プログラムへの入力 説明
グレーテル 4 お菓子の家のサイズの指定
ヘンゼル @
o@
@oo
####
お菓子の家の作成
グレーテル @
o@
@oo
####
σを元にシャッフル
ヘンゼル 2 1 4 3 σの出力
グレーテル 4 お菓子の家のサイズの指定
ヘンゼル @
o@
@oo
####
お菓子の家の作成
グレーテル @
o@
@oo
####
σを元にシャッフル
ヘンゼル 1 2 3 4 σの出力
グレーテル 4 お菓子の家のサイズの指定
ヘンゼル @
o@
oo@
####
お菓子の家の作成
グレーテル @
@o
@oo
####
σを元にシャッフル
ヘンゼル 4 3 2 1 σの出力
グレーテル 0 全てのゲームが終了


Source name

京都大学プログラミングコンテスト2015

Submit提出する