atcoder Darker and Darkerの勉強

・問題
atcoder.jp


・参考
AtCoder AGC 033 A - Darker and Darker (緑色, 300 点) - けんちょんの競プロ精進記録


・考えたこと:DFSかBFSを使うことは分かったが具体的なやり方は思いつかなかった。上の記事を参考にして、スタートを'#'としてbfsをする。'#'からの距離distが最大のものが答えとすれば良いということが分かった。

・注意点:pypyで提出してください。


・実装例:

from collections import deque
H,W=map(int,input().split())
field=[]
for _ in range(H):
  field.append(list(input()))

dx=[1,0,-1,0]
dy=[0,1,0,-1]

#スタートからの距離がdist
dist=[[-1 for _ in range(W)] for _ in range(H)]

que=deque()

#スタート(#)の座標を求める
for i in range(H):
  for j in range(W):
    if field[i][j]=='#':
      sx=i
      sy=j
      dist[sx][sy]=0
      que.append((sx,sy))
      
ans=0
#queがからになるまでやる
while len(que)!=0:
  x,y=que.popleft()  #queの先頭のペアを取り出す
  
  #移動
  for i in range(4):
    next_x=x+dx[i]
    next_y=y+dy[i]
    
    #場外はスルー
    if next_x<0 or next_x>=H or next_y<0 or next_y>=W:
      continue
        
    #未探索ならqueにいれる
    if dist[next_x][next_y]==-1:
      que.append((next_x,next_y))
      #距離の更新
      dist[next_x][next_y]=dist[x][y]+1
      
for i in range(H):
  for j in range(W):
    ans=max(ans,dist[i][j])    
print(ans)