初めての幅優先探索
初めて幅優先探索の問題を解けたときの話。
ABC088のD問題を解いた。
白か黒で塗られたマスのうち、白のマスだけを通ってゴールする場合、
最大でいくつの白マスを黒マスに塗り替え得てもゴールできるか?という問題です。
白マスを通る最短経路を求めればよい。
from collections import Counter, deque H, W = map( int, input().split()) S = [list(input()) for x in range(H)] white = 0 for i in range(H): #すべての白マスの個数 white += Counter(S[i])['.'] Goal = False Able = True path = 1 Sunuke = [[0,0]] #通った白マスを黒マスに入れ替える S[0][0] = '#' while Goal == False and len(Sunuke) != 0: Sunuke_temp = Sunuke Sunuke = [] path += 1 for x in Sunuke_temp: i = x[0] j = x[1] if (min(i+1,H-1) == H-1 and j == W-1) or (min(j+1,W-1) == W-1 and i == H-1): Goal = True Sunuke.append([1,1]) break if S[max(i-1,0)][j] == '.': #左端の場合は現在地を参照する #現在地は黒なのでFalse Sunuke.append([i-1,j]) S[i-1][j] = '#' if S[min(i+1,H-1)][j] == '.': Sunuke.append([i+1,j]) S[i+1][j] = '#' if S[i][max(j-1,0)] == '.': Sunuke.append([i,j-1]) S[i][j-1] = '#' if S[i][min(j+1,W-1)] == '.': Sunuke.append([i,j+1]) S[i][j+1] = '#' print(-1 if len(Sunuke) == 0 else white - path)