paiza Aランクレベルアップセット へび STEP: 16 「時刻に伴う移動 PHP編」

難しいどころじゃなかったです。初見じゃ絶対無理でした。ランクレベルアップセットが少しずつ解いていく形式だからこそ。
学習効果~!

<?php
    // 自分の得意な言語で
    // Let's チャレンジ!!

    /*
    ・ 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 回目の方向転換の時刻 t_i と向き d_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 範囲外かどうか
        
    //mapの取得
    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_times[] = $t[0];
        $rotates[] = $t[1];
       // echo "rotate_time = ".$rotate_time." , rotate = ".$rotate."\n";
    }
    
    //print_r($rotate_times);
    //print_r($rotates);
    
    
    for ($i = 0; $i < 100; $i++) {
        $foo =  $rotate_times[0];


        if($i == $foo){//方向を変えるtimeだったら
            //echo(" まがるたいむ"."\n");
            $rotate = array_shift($rotates);//1つとりだしてけす
        
            //方向を変える
            if($rotate == "L"){
                $dis = rotate_l($dis);
            }else{
                $dis = rotate_r($dis);
            }
            //echo("dis変更後 ".$dis."\n");
            array_shift($rotate_times);////1つけす
            
        }else{
            //echo(" まがるたいむじゃない"."\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){
            //echo("outbox true, please break"."\n");
        }
        
        
        //出力   
        if($outbox == false){
            echo($y." ".$x."\n");
        }else{
            //echo($y." ".$x."\n");
            echo("Stop"."\n");
            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);
    }




?>
kue

あとで利用するかもしれないので、未使用の変数いくつかとfor文がひとつ、わざとコメントアウトして残してあります。したがって構造が読みにくいかもしれません。ご注意ください。なんとなくのご参考までに。

曲がるタイムと方向を配列に入れ、それをひとつ取り出して使っては消し、常に配列0番目を利用する形です。キーとvalueにした方がよかったのでしょうが、ちょっと面倒で配列を2つにしてしまいました。

そしてなぜタイトルが「へび」なのかやっと分かってきました。

kue

なお、
『例によって、君もしくは君のメンバーがphp言語を選択し、あるいはハテナになったとしても、phpは以下の通りだからそのつもりで』

健闘を祈る

0