【Aランクレベルアップメニュー】> 【へび】STEP: 3 移動が可能かの判定・複数回の移動 (paizaランク B 相当) [難易度: 1584 ±12]
※リンク先へ移動するためには[paiza]へのログインが必要です。
マップの行数 H と列数 W , 現在の座標 sy , sx , 移動の回数 N が与えられます。
続けて、障害物を '#' で、移動可能な場所を '.' で表した H 行 W 列 のマップ S_1 ... S_H と N 回の移動の向き d_1 ... d_N が与えられます。
移動者ははじめ北を向いています。移動者は、1 回の移動で次の行動を行います。
「移動の向きに方向転換したのち、1 マス進む。」
各移動が可能である場合、移動後の y , x 座標を出力してください。
移動が可能でない場合、移動後の座標を出力する代わりに "Stop" を出力して、以降の移動を打ち切ってください。
各移動が可能であるということは、以下の図の通り
「移動先が障害物でない かつ 移動先がマップの範囲外でない」
ということを意味します。
なお、マスの座標系は左上端のマスの座標を ( y , x ) = ( 0 , 0 ) とし、
下方向が y 座標の正の向き、右方向が x 座標の正の向きとします。
入力値(例)
7 3 2 1 5
..#
...
...
...
..#
.#.
##.
L
L
L
L
L
出力値(例)
2 0
3 0
3 1
2 1
2 0
解答例
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 |
<?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; $i < $n; $i++) { $d = trim(fgets(STDIN)); if ($d == "L") { $r = ($r + 3) % 4; $x += $dx[$r]; $y += $dy[$r]; } elseif ($d == "R") { $r = ($r + 1) % 4; $x += $dx[$r]; $y += $dy[$r]; } if ($s[$y][$x] == "." and ($y != -1 and $x != -1)) { echo sprintf("%d %d\n", $y, $x); } else { echo "Stop"; break; } } ?> |