B - 危険な区域 / Dangerous Areas Editorial by admin Editorial for printing
gpt-6-astra-medium概要
上から順に各行を調べ、X が含まれる最初の行番号を求めます。どの行にも X がなければ -1 を出力します。
考察
ある行に危険な区域があるかどうかは、その行の文字列に X が含まれているかで判断できます。Python では、'X' in s でこの判定ができます。
求めたいのは、危険な区域がある行のうち最も上にある行です。そのため、上から順に調べて最初に X を見つけた時点で探索を終了すればよいです。それより下の行を調べる必要はありません。
例えば、各行が次のようになっている場合を考えます。
....
..X.
X...
\(1\) 行目には X がなく、\(2\) 行目には X があるので、答えは \(2\) です。\(3\) 行目にも X がありますが、答えには影響しません。
この問題は、すべての区域を確認する素朴な方法でも最大 \(HW \leq 100\) 個の確認で済み、TLE にはなりません。ただし、X を見つけるたびに答えを上書きして最後まで探索すると、最も下の該当行を答えてしまいます。最初に見つけたところで break することが重要です。
アルゴリズム
- 答えを表す変数
ansを-1に初期化します。 - 各行を上から順に、行番号 \(i = 1, 2, \ldots, H\) とともに調べます。
- その行に
Xが含まれていれば、ansに \(i\) を代入し、探索を終了します。
- その行に
ansを出力します。
上から順に調べているため、最初に X が見つかった行より上には危険な区域がありません。したがって、その行が調査を始める行です。また、どの行にも X がなければ ans は -1 のままなので、正しい結果を出力できます。
計算量
- 時間計算量: \(O(HW)\)
各行のXの有無を調べるのに最大 \(O(W)\) かかり、それを最大 \(H\) 行について行います。入力の読み込みも含めて \(O(HW)\) です。 - 空間計算量: \(O(HW)\)
提示コードでは入力全体を読み込み、各行の文字列を保持します。探索で使う追加の変数は \(O(1)\) です。
実装のポイント
enumerate(rows, start=1)を使うと、問題で求められる \(1\) 始まりの行番号をそのまま取得できます。ans = -1と初期化しておくことで、危険な区域がない場合も特別な分岐なしで処理できます。Xを見つけたらbreakし、最初に見つけた行番号を保持します。文字列全体に対して
'X' in sで判定できるため、列数 \(W\) を探索処理で直接使う必要はありません。ソースコード
import sys
def main():
data = sys.stdin.read().split()
H = int(data[0])
# W = int(data[1]) # unused
rows = data[2:2 + H]
ans = -1
for i, s in enumerate(rows, start=1):
if 'X' in s:
ans = i
break
print(ans)
main()
この解説は gpt-6-astra-medium によって生成されました。
posted:
last update: