泣きたくなるほど謎のエラーがたくさん出て、結局また一から打ち直しました。
特に前回のSTEPで通っていた部分がエラーになるのが謎。
shift_arrayになぜか「もうないから削除できないんだけど」というエラーが出て(100個ほど)、
それを回避しなくてはいけなくなりました。
前のSTEPでは大丈夫だったのですが。
まあいいや。
通ってよかったです!

<?php
/*
・ 1行目では、盤面の行数 H ,列数 W , 石を置くマスの y , x 座標 である Y , X が与えられます。
・ 続く H 行のうち i 行目 (0 ≦ i < H) には、盤面の i 行目の文字をまとめた文字列 S_i が与えられ、
S_i の j 文字目は、盤面の i 行目の j 列目に書かれている文字を表します。
・ 続く N 行のうち i 行目 (1 ≦ i ≦ N) には、i 回目の方向転換をおこなう時刻 t_i と、方向転換の向き d_i が与えられます。
*/
$s = trim(fgets(STDIN));
$s = str_replace(array("\r\n","\r","\n"), '', $s);
$s = explode(" ", $s);
$h = $s[0];
$w = $s[1];
$y = $s[2];
$x = $s[3];
$num = $s[4];
$dis = "N";//初期方角
$outbox = false;//reset 範囲外または進めない
//マップ
for ($i = 0; $i < $h; $i++) {
$hoge = trim(fgets(STDIN));
for ($j = 0; $j < $w; $j++) {
$map[$i][$j] = mb_substr($hoge,$j,1);
}
}
//print_r($map);
//初期位置を*に
$map[$y][$x] = "*";
//曲がる時刻と方向
for ($i = 0; $i < $num; $i++) {
$t = trim(fgets(STDIN));
$t = str_replace(array("\r\n","\r","\n"), '', $t);
$t = explode(" ", $t);
$times[$i] = $t[0];
$rotates[$i] = $t[1];
}
//print_r($times);
//print_r($rotates);
//移動
for ($i = 0; $i < 100; $i++) {
if($times[0]==$i){//曲がるポイントだったら
$rotate = array_shift($rotates);//1つ取り出して消す
//方向を変える
if($rotate == "L"){
$dis = rotate_l($dis);
}else{
$dis = rotate_r($dis);
}
//echo("dis変更後 ".$dis."\n");
if(count($times)>1){
array_shift($times);
}
}
//print_r($times);
//ます移動
if($dis=="N"){
if($y>0 && $map[$y-1][$x]=="."){
$y--;
$map[$y][$x] = "*";
}else{
$outbox = true;
}
}elseif($dis=="E"){
if($x < $w && $map[$y][$x+1]=="."){
$x++;
$map[$y][$x] = "*";
}else{
$outbox = true;
}
}elseif($dis=="S"){
if($y < $h && $map[$y+1][$x]=="."){
$y++;
$map[$y][$x] = "*";
}else{
$outbox = true;
}
}elseif($dis=="W"){
if($x > 0 && $map[$y][$x-1]=="."){
$x--;
$map[$y][$x] = "*";
}else{
$outbox = true;
}
}else{
echo("予想外");
}
if($outbox == true){
//echo("outbox is true, now break"."\n");
break;
}
}
//出力
for ($i = 0; $i < $h; $i++) {
for ($j = 0; $j < $w; $j++) {
echo($map[$i][$j]);
}
echo("\n");
}
//関数
function rotate_l($dis){
if($dis=="N"){
$dis="W";
}elseif($dis=="W"){
$dis="S";
}elseif($dis=="S"){
$dis="E";
}elseif($dis=="E"){
$dis="N";
}
return($dis);
}
function rotate_r($dis){
if($dis=="N"){
$dis="E";
}elseif($dis=="E"){
$dis="S";
}elseif($dis=="S"){
$dis="W";
}elseif($dis=="W"){
$dis="N";
}
return($dis);
}
?>

謎だったのはこれです。このif文を入れないとエラーになる。
結局countでifをかけて、最後のひとつは消さないようにしました。
if(count($times)>1){
array_shift($times);
}
構造としては、
- マップを配列に入れる
- 曲がる時刻と方向をそれぞれ配列に入れる
- for文で100回まわす。その際、曲がる時刻に該当したら、方向の配列($rotates)から最初のひとつ取り出してそれは消す。常に配列の0番目で判定する。(array_shift)
- 時刻の配列($times)も同様に、使ったら冒頭を消す
- 進みたい方向が範囲内で、かつ”.”だったら進み、それ以外(指定していないが、結果的に*と#)だったら、breakしてfor文を抜ける
- 出力
大変でした!!!

ぜひphpにも温情をお待ちしております
paizaさんのスキルアップ問題集トップページはこちら(各言語に対応されています。すごく良く考えられていて実践的。おすすめ)
https://paiza.jp/works/mondai
この記事の「へび php」問題があるページはこちら
https://paiza.jp/works/mondai/a_rank_level_up_problems/problem_index?language_uid=php
2+