LoginSignup
0
0

問題

グリッドの行数 H と列数 W が与えられるので、マス (y,x) から次の移動を 1 回おこなった時に到達>することができるマスを '*' , それ以外のマスを '.' にしたグリッドを出力してください。

・現在いるマスを (y,x) としたとき、(y+1,x), (y-1,x), (y,x+1), (y,x-1) のいずれかのマスに移動する。

ただし、グリッドの外へは移動することができません。
なお、グリッドの左上・右上・左下・右下のマスをそれぞれ (0,0), (0,W-1), (H-1,0), (H-1,W-1) とします。
到達できるマスに (y,x) が含まれることに気をつけてください。
出典:Paizaラーニング

模範解答を参考にして、作成しました。全く分からなかった戒めとして、何がどうなっているのか書き留めていこうかなと。

論理値型配列を作る

論理値型配列を作って、最後に真偽値の判定からgridを出力します。

<?php
    list($h, $w) = explode(" ", trim(fgets(STDIN)));
    list($y, $x) = explode(" ", trim(fgets(STDIN)));
    
    for($i = 0; $i < $h; $i++) {
        $grid = ""; 
        for($j = 0; $j < $w; $j++) {
            $able_reach = false;

移動できる範囲の判定

横方向に移動できるのか判定しています。

            if($i == $y) {
                if(0 <= $j && $j == $x-1) {
                // 0以上であるかつ、出発地点から横方向に-1の場所
                    $able_reach = true;
                }
                if($j < $w && $j == $x+1) {
                // 列数の間に入っている、出発地点から横方向に+1の場所
                    $able_reach = true;
                }
            }

縦方向に移動できるのか判定しています。

            if($j == $x) {
                if(0 <= $i && $i == $y-1) {
                // 0以上であるかつ、出発地点から縦方向に-1の場所
                    $able_reach = true;
                }
                if($i < $h && $i == $y+1) {
                // 列数の間に入っている、出発地点から縦方向に+1の場所
                    $able_reach = true;
                }
            }

出発地点

出発地点です。

            if($i == $y && $j == $x) {
                $able_reach = true;
            }

出力

            if($able_reach) {
                $grid .= "*"; 
            }else{
                $grid .= ".";
            }
        }
       echo $grid."\n"; 
    }

終わりに

 この問題は列と行の関係をしっかりと押さえておかないと、頭の中がごちゃごちゃになってしまいます。今回は移動できる範囲の判定のところですね。
 正直言って自分も、ほんとにあっているのかわからないところもあります。自分なりの解釈なので、悪しからず。何か間違いなどがありました、コメントでご教授いただけますと幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0