ここでは、深さ優先探索(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)