ここでは、深さ優先探索(DFS)について、「プログラミングコンテストチャレンジブック(第2版)」の p35 Lake Counting を例に、python3 で実装する方法を紹介します。
# 入力
N, M = 10, 12
field = [ ['W', '.', '.', '.', '.', '.', '.', '.', '.', 'W', 'W', '.'],
['.', 'W', 'W', 'W', '.', '.', '.', '.', '.', 'W', 'W', 'W'],
['.', '.', '.', '.', 'W', 'W', '.', '.', '.', 'W', 'W', '.'],
['.', '.', '.', '.', '.', '.', '.', '.', '.', 'W', 'W', '.'],
['.', '.', '.', '.', '.', '.', '.', '.', '.', 'W', '.', '.'],
['.', '.', 'W', '.', '.', '.', '.', '.', '.', 'W', '.', '.'],
['.', 'W', '.', 'W', '.', '.', '.', '.', '.', 'W', 'W', '.'],
['W', '.', 'W', '.', 'W', '.', '.', '.', '.', '.', 'W', '.'],
['.', 'W', '.', 'W', '.', '.', '.', '.', '.', '.', 'W', '.'],
['.', '.', 'W', '.', '.', '.', '.', '.', '.', '.', 'W', '.'] ]
# 現在位置(x, y)
def dfs(x, y):
# 今いることろを'.'に置き換える
field[x][y] = '.'
# 移動する8方向をループ
for dx in range(-1, 2):
for dy in range(-1,2):
# x方向にdx, y方向にdy 移動した場所を(nx, ny)とする
nx, ny = x + dx, y + dy
# nxとnyが fieldの範囲内かどうか?とfield[nx][ny]が水溜まりかどうか?を判定
if 0 <= nx and nx < N and 0 <= ny and ny < M and field[nx][ny] == 'W':
dfs(nx, ny)
return
if __name__ == '__main__':
res = 0
for i in range(N):
for j in range(M):
if field[i][j] == 'W':
dfs(i,j)
res += 1
print(res)