E - すごろく Editorial /

Time Limit: 2 sec / Memory Limit: 128 MB

この問題は正しく採点されていないという報告を受けています。

友達のいないきつねのボブは,今日は一人ですごろく遊びをして過ごすことにした. 各面に整数a_1,a_2,a_3,a_4,a_5,a_6が書かれた6面ダイスと,駒と,直線上にM個のマスがあり 左から順に1からMまでの番号が割り当てられたすごろく盤を用いることにした. すごろく盤の各マスには指示が数字で書かれており,i番目のマスには数字N_iが書かれている. これは,その値が正なら右,負なら左に,その絶対値だけ駒を移動せよという意味である. すなわち,i+N_i番目のマスに駒を移動せよという意味である. ボブは,以下のようにしてすごろく遊びをする.まず駒をスタート地点に置く. 次にサイコロを振り,サイコロが出た目の数を見て,駒を「現在のマスから右に移動する」か 「左に移動する」か「現在のマスに留まる」かを選択することができる. マスから移動する場合は,サイコロの出目の距離だけ駒を移動して,移動した先のマスの指示に従う. 指示に従って移動した先のマスの指示には従わない. 以後,ボブは上記のようにサイコロを振って駒を移動することを繰り返す. 移動した結果すごろく盤の外に駒が出てしまったらボブの負けであり,誤答(Wrong Answer)と判定される. この問題の目的はこのすごろくをゴールすることである.サイコロを振る回数は3000回以下とする.

入出力形式

入力は以下の形式で与えられる.

M
a_1 a_2 a_3 a_4 a_5 a_6
s g
N_1 ... N_M

Mはすごろく盤のマスの数である. a_1 ... a_6 はサイコロの各面に書かれている整数の値である. sgはそれぞれすごろく盤のスタートとゴールの番号である. N_ii番目のマスに書かれている指示である. これらの入力の後, さいころを振った結果を表す値 dice が改行とともに引き続いて入力から与えられる. これは,サイコロを振って出た目が adice であることを表す. これに対して,あなたのプログラムは駒を進めるかどうかを決め,その選択を出力しなければならない.駒を右に移動するならば 1 を,左に移動するならば -1 を,現在のマスに留まるならば 0 を出力せよ.出力の後には改行を出力せよ. あなたのプログラムが進むか戻るか留まるかを出力すると,次のサイコロを振った結果を入力から受け取ることができる.これを繰り返す. 例えばC/C++では

scanf("%d", &dice);

としてサイコロの面の番号を受け取り,これに対して左に移動するなら

printf("-1\n"); fflush(stdout);

とする.次に,

scanf("%d", &dice);

とすると,次のサイコロの面の番号を受け取ることが出来る.すごろくにゴールしたら直ちにプログラムを終了せよ. ゴールに辿り着くまでにサイコロを振る回数は3000回以下でなければならない. サイコロを振った回数が途中で3000回を超えた場合,誤答と判定される.

制約

  • 2 ≤ M ≤ 300
  • 1 ≤ s ≤ M, 1 ≤ g ≤ M
  • s \neq g
  • 1 ≤ a_i ≤ M-1
  • 1 ≤ dice ≤ 6
  • N_s = N_g = 0
  • マスの命令に従って駒を進めて枠外に出る事はない.
  • dice\{1,2,…,6\} から擬似乱数で一様ランダムに選ばれる.
  • いくらサイコロを振ったとしてもゴールできない盤面は与えられない.
  • 入力の値は全て整数である.

入出力例1

すごろくの説明プログラムの出力プログラムへの入力サイコロの目駒の移動後のマスの番号
10 1 6 2 5 3 4 1 10 0 -1 3 -1 3 -2 -6 -5 -7 0
1回目のサイコロ11
1回目のプログラムの出力01
2回目のサイコロ32
2回目のプログラムの出力16
3回目のサイコロ53
3回目のプログラムの出力06
4回目のサイコロ11
4回目のプログラムの出力-18
5回目のサイコロ32
5回目のプログラムの出力110

Source Name

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