
日刊競プロ ABC 197 - B - Visibility-
問題文
縦 H 行、横 W 列のマス目があり、いくつかのマスには障害物が置かれています。
上から i 番目、左から j 番目のマスをマス (i,j) と表すことにします。
H 個の文字列 S1,S2,S3,…,SHが与えられます。Siの j 文字目はマス (i,j) の状態を表し、# なら障害物が置かれていることを、. なら障害物が置かれていないことを表します。
このマス目上のあるマスからあるマスが見えるとは、2 つのマスが同じ行または列にあり、2 つのマスの間 (2 つのマス自身を含む) に障害物が 1 つも置かれていないことを意味します。
このマス目上のマスであって、マス (X,Y) から見えるもの (マス (X,Y) 自身を含む) の数を求めてください。
制約
1≤H≤100
1≤W≤100
1≤X≤H
1≤Y≤W
Siは . および # のみからなる長さ W の文字列
マス (X,Y) に障害物は置かれていない
考えたこと
対象のマスから外側を見たときに、どこまで見えているかを考える。その場合、外側から数えてしまうとコードが難しくなるので、対象のマスから外側へ「.」があるかを数えるようにすると良い。上下左右で4回数えてあげれば良い。自分のマスもカウントする必要があるので、4回数える場合は3を引いてあげれば良い
H,W,X,Y = map(int,input().split())
templist = []
tatelist = []
for i in range(H):
a=input()
templist.append(a)
ans=-3
for j in range(Y-1,-1,-1):
if templist[X-1][j]==".":
ans+=1
else:
break
for j in range(Y-1,W):
if templist[X-1][j]==".":
ans+=1
else:
break
for i in range(X-1,-1,-1):
if templist[i][Y-1]==".":
ans+=1
else:
break
for i in range(X-1,H):
if templist[i][Y-1]==".":
ans+=1
else:
break
print (ans)
写真はサンシャイン水族館のペンギン