これを解くのに2日かかってしまいました。
なにかデータの食わせ方がまちがっていたらしい。
ついでにころっと壁判定を忘れていた。
一から書き直してなんとか通りました。
このへび問題、かなり難しいです。頭を使う。

この入力例3がなかなか通らなかった。(壁判定を忘れているとここでひっかかる)

<?php
/*
・ 1 行目には盤面の行数を表す整数 H , 盤面の列数を表す整数 W , 現在の y, x 座標を表す sy sx , 移動する回数 N が与えられます。
・ 続く H 行のうち i 行目 (0 ≦ i < H) には、盤面の i 行目の文字をまとめた文字列 S_i が与えられ、 S_i の j 文字目は、盤面の i 行目の j 列目に書かれている文字を表します。(0 ≦ j < W)
・ 続く N 行のうち i 行目 (1 ≦ i ≦ N) には、i 回目の移動の向き d_i と移動するマス数 l_i が与えられます。
*/
//プレイヤーははじめ北を向いています。
$s = trim(fgets(STDIN));
$s = str_replace(array("\r\n","\r","\n"), '', $s);
$s = explode(" ", $s);
//echo "hello = ".$s[0]." , world = ".$s[1]."\n";
$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);
for ($i = 0; $i < $num; $i++) {
//echo($i."かいめ"."\n");
$t = trim(fgets(STDIN));
$t = str_replace(array("\r\n","\r","\n"), '', $t);
$t = explode(" ", $t);
$rotate = $t[0];
$masu = $t[1];
//echo "rotate = ".$rotate." , masu = ".$masu.", dis = ".$dis."\n";
//方向変える
if($rotate == "L"){
$dis = rotate_l($dis);
//echo("dis変更後 ".$dis."\n");
}else{
$dis = rotate_r($dis);
//echo("dis変更後 ".$dis."\n");
}
//マス数移動
for ($j = 0; $j < $masu; $j++) {
if($dis=="N"){
if($y>0 && $map[$y-1][$x]=="."){
$y--;
}else{
$outbox = true;
//break ;
}
}elseif($dis=="E"){
if($x < $w && $map[$y][$x+1]=="."){
$x++;
}else{
$outbox = true;
//break ;
}
}elseif($dis=="S"){
if($y < $h && $map[$y+1][$x]=="."){
$y++;
}else{
$outbox = true;
//break ;
}
}elseif($dis=="W"){
if($x > 0 && $map[$y][$x-1]=="."){
$x--;
}else{
$outbox = true;
//break ;
}
}else{
echo("予想外");
}
}
//出力
if($outbox == false){
echo($y." ".$x."\n");
}else{
echo($y." ".$x."\n");
echo("Stop"."\n");
break;
}
}//end for i
//関数
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);
}
?>

不要なbreakを入れてしまったりして、試行錯誤しました。(不要なbreakはコメントアウトしてあります)
本来ひとつ前のSTEPのコードを引いてくるのが良いのだろうけど、すこし関数をかませて構造を変えました。
データのくわせかたが修正できなかったため、標準入力のサンプル通りの記述を使っています。本来こんな面倒な記述↓じゃなくてよいと思います。なぜかうまくいかなかったので。
//標準入力サンプル
$t = trim(fgets(STDIN));
$t = str_replace(array("\r\n","\r","\n"), '', $t);
$t = explode(" ", $t);
0