ABC464 B - Crop

切り抜き

考え方

上下左右の余白を切り落とす問題。
入力例を見れば容易にわかるように、黒マスがある範囲を切り出して出力すればよい。

そのため、まず黒マスの存在範囲を調べる。
具体的には、すべての黒いマスの位置 $(i,j)$ について、以下を調べればよい。

最後に、$u$ 行目から $d$ 行目までについて、$l$ 列目から $r$ 列目までを切り出して出力すればよい。
これは、forループとかで $1$ 文字ずつ取り出すか、.substr() で $r-l+1$ 文字まとめて取り出す。

入力例1での動作

入力を受け取る。

h: 4
w: 5
s: {".....",
    "..#..",
    ".###.",
    "....."}

答え用の変数 result を空の状態で用意する。

result: {}

すべてのマスをチェックする。
黒いマスは、0-indexed で次の位置にある。

(1, 2), (2, 1), (2, 2), (2, 3)

黒いマスがある範囲を調べると、次のようになる。

l: 1
r: 3
u: 1
d: 2

そのため、$1$ 行目から $2$ 行目までについて、$1$ 列目から $3$ 列目までを切り出せばよい。

$1$ 行目を切り出す。

s[1]: "..#.."
s[1].substr(1,3): ".#."
result: {".#."}

$2$ 行目を切り出す。

s[2]: ".###."
s[2].substr(1,3): "###"
result: {".#.",
         "###"}

注意点

特になし。

別解

特になし。