ABC464 B - Crop
切り抜き
考え方
上下左右の余白を切り落とす問題。
入力例を見れば容易にわかるように、黒マスがある範囲を切り出して出力すればよい。
そのため、まず黒マスの存在範囲を調べる。
具体的には、すべての黒いマスの位置 $(i,j)$ について、以下を調べればよい。
- 左端:$j$ の最小値
- 右端:$j$ の最大値
- 上端:$i$ の最小値
- 下端:$i$ の最大値
最後に、$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: {".#.",
"###"}
注意点
特になし。
別解
特になし。