【Aランクレベルアップメニュー】> FINAL問題 へび (paizaランク A 相当) [難易度: 1929 ±13]
※リンク先へ移動するためには[paiza]へのログインが必要です。
マップ上をへびが移動していきます。
マップの行数 H と列数 W ,障害物を '#' で移動可能な場所を '.' で表した H 行 W 列のマップ S_1 ... S_H , 現在の座標 sy , sx , 方向転換の回数 N が与えられます。
続けて N 回の方向転換をおこなう時刻 t_1 ... t_N, 転換する向き d_1 ... d_N が与えられます。
へびははじめは北を向いています。
へびは進む先のマスに自分の身体や障害物がない時に移動ができます。
時刻 0 から 99 までの間、へびは各時刻に次の行動を最大 100 回繰り返します。
・ 方向転換をおこなう時刻の場合、指定の向きに方向転換したのち 1 マス身体を伸ばす。そうでない時は、今向いている方向に 1 マス身体を伸ばす。
時刻が 99 の時の行動を終えるか、移動できなくなった時、移動を終了します。
移動終了時にへびの体のあるマスを '*' にしたマップを出力してください。
移動が可能であるということは、
「移動先のマスに自分の身体や障害物がない かつ 移動先がマップの範囲外でない」
ということを意味します。
なお、マスの座標系は左上端のマスの座標を ( y , x ) = ( 0 , 0 ) とし、
下方向が y 座標の正の向き、右方向が x 座標の正の向きとします。
入力値(例)
5 5 3 1 3
.....
.....
.....
.....
.....
2 R
4 R
6 R
出力値(例)
.....
.***.
.*.*.
.***.
.....
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
<?php list($h, $w, $y, $x, $n) = explode(" ", trim(fgets(STDIN))); for ($i = 0; $i < $h; $i++) { $s[] = trim(fgets(STDIN)); } $dx = [1, 0, -1, 0]; $dy = [0, 1, 0, -1]; for ($i = 0, $r = 3, $k = 0; $i < $n; $i++) { list($t, $d) = explode(" ", trim(fgets(STDIN))); for (; $k < $t; $k++) { $s[$y][$x] = "*"; $nx = $x + $dx[$r]; $ny = $y + $dy[$r]; if ($s[$ny][$nx] == "." and ($ny != -1 and $nx != -1) and $s[$ny][$nx] != "*") { $x = $nx; $y = $ny; $s[$y][$x] = "*"; } else { for ($j = 0; $j < $h; $j++) { echo $s[$j]. "\n"; } exit; } } if ($d == "L") { $r = ($r + 3) % 4; } elseif ($d == "R") { $r = ($r + 1) % 4; } } for (; $k < 100; $k++) { $s[$y][$x] = "*"; $nx = $x + $dx[$r]; $ny = $y + $dy[$r]; if ($s[$ny][$nx] == "." and ($ny != -1 and $nx != -1) and $s[$ny][$nx] != "*") { $x = $nx; $y = $ny; $s[$y][$x] = "*"; } else { for ($j = 0; $j < $h; $j++) { echo $s[$j]. "\n"; } exit; } } for ($j = 0; $j < $h; $j++) { echo $s[$j]. "\n"; } ?> |