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