AtCoder ABC 197 B – Visibility Python解説

スポンサーリンク

Visibility

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

AtCoder Beginner Contest 「Visibility」

マス目(x, y)から見えるマス目の数を数えていきます。マス目はマス(x, y)の同じ行、同じ列の範囲内で障害物"#"にあたるまで調べます。また、マス(x, y)も見えるマス目に含まれるので気を付けましょう。

h, w, x, y = map(int, input().split())
a = []

x -= 1
y -= 1

for i in range(h):
    a.append(input())
    
cnt = 1

for i in range(x+1, h):
    if a[i][y] != "#":
        cnt += 1
    else:
        break
    
for i in range(x-1, -1, -1):
    if a[i][y] != "#":
        cnt += 1
    else:
        break
        
for i in range(y+1, w):
    if a[x][i] != "#":
        cnt += 1
    else:
        break
        
for i in range(y-1, -1, -1):
    if a[x][i] != "#":
        cnt += 1
    else:
        break
        
print(cnt)

入力から受け取るxとyは列がx、行がyとなっているので注意です。x, yはマス目の0から数えたいので共に-1しています。配列でマス目を受け取ったら見えるマス目を数えていきます。

調べる範囲は(x, y)を除いたマス目から上下左右です。ですので、計4つのfor文を実装しています。マス目は"#"だったらそこでbreak、そうでなかったら見えるマス目としてカウントを+1します。最後にcntを出力して完了です。