paiza Aランクレベルアップセット へび「へび PHP編」FINAL問題

泣きたくなるほど謎のエラーがたくさん出て、結局また一から打ち直しました。
特に前回の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);
    }
 
    
?>
kue

謎だったのはこれです。このif文を入れないとエラーになる。
結局countでifをかけて、最後のひとつは消さないようにしました。

            if(count($times)>1){
                array_shift($times);
            }

構造としては、

  • マップを配列に入れる
  • 曲がる時刻と方向をそれぞれ配列に入れる
  • for文で100回まわす。その際、曲がる時刻に該当したら、方向の配列($rotates)から最初のひとつ取り出してそれは消す。常に配列の0番目で判定する。(array_shift)
  • 時刻の配列($times)も同様に、使ったら冒頭を消す
  • 進みたい方向が範囲内で、かつ”.”だったら進み、それ以外(指定していないが、結果的に*と#)だったら、breakしてfor文を抜ける
  • 出力

大変でした!!!

kue

ぜひphpにも温情をお待ちしております

paizaさんのスキルアップ問題集トップページはこちら(各言語に対応されています。すごく良く考えられていて実践的。おすすめ)

https://paiza.jp/works/mondai

この記事の「へび php」問題があるページはこちら
https://paiza.jp/works/mondai/a_rank_level_up_problems/problem_index?language_uid=php

2+