Edit

【pythonでABC197を解説】B - Visibility

問題概要

問題ページ

問題文

縦 \(H\) 行、横 \(W\) 列のマス目があり、いくつかのマスには障害物が置かれています。
上から \(i\) 番目、左から \(j\) 番目のマスをマス \((i, j)\) と表すことにします。
\(H\) 個の文字列 \(S_1, S_2, S_3, \dots, S_H\) が与えられます。\(S_i\) の \(j\) 文字目はマス \((i, j)\) の状態を表し、# なら障害物が置かれていることを、. なら障害物が置かれていないことを表します。
このマス目上のあるマスからあるマスが見えるとは、\(2\) つのマスが同じ行または列にあり、\(2\) つのマスの間 (\(2\) つのマス自身を含む) に障害物が \(1\) つも置かれていないことを意味します。
このマス目上のマスであって、マス目 \((X, Y)\) から見えるもの (マス \((X, Y)\) 自身を含む) の数を求めてください。

制約

  • \(1 \le H \le 100\)
  • \(1 \le W \le 100\)
  • \(1 \le X \le H\)
  • \(1 \le Y \le W\)
  • \(S_i\) は . および # のみからなる長さ \(W\) の文字列
  • マス \((X, Y)\) に障害物は置かれていない

問題の考察

ACコード

import sys


def solve():
    input = sys.stdin.readline
    mod = 10 ** 9 + 7
    h, w, x, y = list(map(int, input().rstrip('\n').split()))
    s = [list(str(input().rstrip('\n'))) for _ in range(h)]
    cnt = 0
    for i in range(x - 1, -1, -1):
        if s[i][y-1] == ".":
            cnt += 1
        else:
            break
    for i in range(x - 1, h):
        if s[i][y-1] == ".":
            cnt += 1
        else:
            break
    for i in range(y - 1, -1, -1):
        if s[x-1][i] == ".":
            cnt += 1
        else:
            break
    for i in range(y - 1, w):
        if s[x-1][i] == ".":
            cnt += 1
        else:
            break
    print(cnt - 3)


if __name__ == '__main__':
    solve()

-Edit
-