paiza Aランクレベルアップセット へび「STEP: 14移動が可能かの判定・幅のある移動 PHP編」

これを解くのに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);
    }



?>
kue

不要なbreakを入れてしまったりして、試行錯誤しました。(不要なbreakはコメントアウトしてあります)

本来ひとつ前のSTEPのコードを引いてくるのが良いのだろうけど、すこし関数をかませて構造を変えました。
データのくわせかたが修正できなかったため、標準入力のサンプル通りの記述を使っています。本来こんな面倒な記述↓じゃなくてよいと思います。なぜかうまくいかなかったので。

//標準入力サンプル
        $t = trim(fgets(STDIN));
        $t = str_replace(array("\r\n","\r","\n"), '', $t);
        $t = explode(" ", $t);
0