paiza Aランクレベルアップセット へび STEP: 15 「幅のある移動 PHP編」

step14からわずかに付け足し。

<?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);
    
    
    //初期位置を*に
    $map[$y][$x] = "*";
    
    
    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--;
                    $map[$y][$x] = "*";
                }else{
                    $outbox = true;
                    //break ;
                }
                
            }elseif($dis=="E"){
                 if($x < $w && $map[$y][$x+1]=="."){
                    $x++;
                    $map[$y][$x] = "*";
                }else{
                    $outbox = true;
                    //break ;
                }   
            }elseif($dis=="S"){
                 if($y < $h && $map[$y+1][$x]=="."){
                    $y++;
                    $map[$y][$x] = "*";
                }else{
                    $outbox = true;
                    //break ;
                }  
            }elseif($dis=="W"){
                 if($x > 0 && $map[$y][$x-1]=="."){
                    $x--;
                    $map[$y][$x] = "*";
                }else{
                    $outbox = true;
                    //break ;
                }  
            }else{
                echo("予想外");
            }       
        }
        
        if($outbox==true){
            break;
        }
        
    }//end for i

    //出力 
    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);
    }



?>

出力する場所がforの中でなくなったのでちょっと引っかかった。今回の出力はforの外の方がいい。

0