盤面上にロボットと壁,ゴールが設置されており, ロボットの行動パターンを記述したプログラムが与えられる.
与えられるプログラムは以下のEBNF で表される.
プログラム:= {文}; 文:= if 文|while 文|動作文; if 文:= "[", 条件, プログラム, "]"; while 文:= "{", 条件, プログラム, "}"; 動作文:= "^"|"v"|"<"|">"; 条件:= ["~"], "N"|"E"|"S"|"W"|"C"|"T";
「プログラム」は0個以上の「文」からなり,1つ以上の文が存在する場合は 1 つ目の文から順番に1 つずつ文が実行される.「文」は「動作文」,「if 文」,「while 文」のいずれかである.「動作文」は"^", "v","<",">" のいずれかであり,それぞれ以下の動作が実行される.
「if 文」は "[",「条件」,「プログラム」,"]" を順番に並べたもので,以下の手順で実行される.
「while 文」は "{",「条件」,「プログラム」,"}" を順番に並べたもので,以下の手順で実行される.
「条件」は "N", "E", "S", "W", "C", "T" のいずれかであり,先頭には"~" をつけることができる.それぞれの記述は以下の真偽値を表す.
ロボットは最初,北を向いているものとする.ロボットは壁を通ることができず,何もないマスのみを移動できる.もし,プログラムが壁の上を通るような動作を実行しようとした場合,ロボットは移動せずその場にとどまる.最後に,ロボットはゴールに到達した時,実行途中のプログラムが残っていたとしてもすべて中断して動作を停止する.
このとき,ロボットがゴールにたどり着くまでにどのぐらい時間がかかるのか知りたい.ロボットは条件判定やプログラムの読み込みに関しては非常に高速に実行できるので実際の動作時間を決定するのは「動作文」のみである.そこで,このロボットがゴールに辿り着くまでに「動作文」を何回実行するかを教えてほしい.
なお,壁の上を通るような動作を実行しようとして,実際には「動作文」の動作が行われなかった場合にも「動作文」は実行されたものとみなす.
入力は以下の形式で与えられる.
H W a1,1a1,2 . . . a1,W a2,1a2,2 . . . a2,W : : : aH,1aH,2 . . . aH,W s
H は盤面の高さ,W は盤面の幅を表す.
次に盤面を真上から見た状態が与えられる.この盤面は上,下,左,右がそれぞれ北,南,西,東に対応する.各マスの状態を表す ai,j は以下のいずれかの文字である.
s にはロボットに与えられるプログラムが文字列として入力される.
たどり着ける場合は"到達するまでに実行した「動作文」の数" を,たどりつけない場合は "-1" を出力せよ.なお,壁の上を通るような動作を実行しようとして,実際には「動作文」の動作が行われなかった場合にも「動作文」が実行されたものとみなす点に注意せよ(入力例1).
5 3 ### #g# #.# #s# ### ^<^<vv
5
5 7 ####### #.#g..# #.###.# #s....# ####### {T{~C^}<}
17
5 7 ####### #.#g..# #.###.# #s....# ####### {T{~C^}>}
-1