【Aランクレベルアップメニュー】> FINAL問題 マップの判定・縦横 (paizaランク B 相当) [難易度: 1511 ±7]
※リンク先へ移動するためには[paiza]へのログインが必要です。
マップの行数 H と列数 W とマップを表す H 行 W 列の文字列 S_1 ... S_H が与えられるので、
隣接する上下左右のマスが全て '#' であるマスの y , x 座標 を答えてください。
ただし、左端のマスの場合は「右のマスが '#' 」であれば、右端のマスの場合は「左のマスが '#' 」であれば隣接する左右のマスが全て '#' であるものとします。
また、上端のマスの場合は「下のマスが '#' 」であれば、下端のマスの場合は「上のマスが '#' 」であれば隣接する上下のマスが全て "#" であるものとします。
なお、マスの座標系は左上端のマスの座標を ( y , x ) = ( 0 , 0 ) とし、
下方向が y 座標の正の向き、右方向が x 座標の正の向きとします。
入力値(例)
3 3
##.
###
...
出力値(例)
0 0
0 2
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php list($h, $w) = explode(" ", trim(fgets(STDIN))); for ($i = 0; $i < $h; $i++) { $s[] = trim(fgets(STDIN)); } for ($y = 0; $y < $h; $y++) { for ($x = 0; $x < $w; $x++) { $flag_row = false; $flag_column = false; if ($x == 0 or $s[$y][$x - 1] == "#") { if ($x == $w - 1 or $s[$y][$x + 1] == "#"){ $flag_row = true; } } if ($y == 0 or $s[$y - 1][$x] == "#") { if ($y == $h - 1 or $s[$y + 1][$x] == "#") { $flag_column = true; } } if ($flag_column and $flag_row) { echo sprintf("%d %d\n", $y, $x); } } } ?> |
感想
はじめに、どうしても解けなくて、paizaの森での解答を参考にさせていただきました(↓)。こちらのほうがとてもすっきりしていてキレイだと思います。ただ、理解はできたのですが自分ではじめからこのようなコードを書けるかといわれるとまだまだ難しいです。頑張ります...(*'ω'*)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php list($h, $w) = explode(" ", trim(fgets(STDIN))); for ($i = 0; $i < $h; $i++) { $s[] = trim(fgets(STDIN)); } for ($i = 0; $i < $h; $i++) { for ($j = 0; $j < $w; $j++) { if (($i-1 < 0 or $s[$i-1][$j] == '#') and ($j-1 < 0 or $s[$i][$j-1] == '#') and ($i+1 >= $h or $s[$i+1][$j] == '#') and ($j+1 >= $w or $s[$i][$j+1] == '#')) { echo sprintf("%d %d\n", $i, $j); } } } ?> |