Skip to content

18160: 最大连通域面积

matrix/dfs similar, http://cs101.openjudge.cn/practice/18160

一个棋盘上有棋子的地方用('W')表示,没有的地方用点来表示,现在要找出其中的最大连通区域,一个格子被视作和它周围八个格子都相邻。

现在需要 找出最大的连通区域的面积是多少,一个格子代表面积为1。

输入

输入的第一行是一个整数,表示一共有 T 组数据。 每组第一行包含两个整数N和M。 接下来的N行,每行有M个字符('W'或者'.'),表示格子的当前状态。字符之间没有空格。

输出

每组数据对应一行,输出最大的连通域的面积,不包含任何空格。

样例输入

2
2 2
W.
.W
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.

样例输出

2
16

来源:cs101-2017 期末机考备选

核心思想是对每一个点找其连通域面积,再从中找出最大者。主要运用函数的自我调用达到深度优先搜索。

有个坑点,如果把每个连通面积的值存入列表,最后max列表,当面积为0会RE。改正方法是列表初始化为[0]。

OJ的pylint是静态检查,有时候报的编译错误Compile Error不对。解决方法有两种,如下: 1)第一行加# pylint: skip-file 2)方法二:如果函数内使用全局变量(变量类型是immutable,如int),则需要在程序最开始声明一下。如果是全局变量是list类型,则不受影响。

python
# pylint: skip-file
dire = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]]

def dfs(x,y):
    global area
    if matrix[x][y] == '.':return
    matrix[x][y] = '.'
    area += 1
    for i in range(len(dire)):
        dfs(x+dire[i][0], y+dire[i][1])


for _ in range(int(input())):
    n,m = map(int,input().split())

    matrix = [['.' for _ in range(m+2)] for _ in range(n+2)]
    for i in range(1,n+1):
        matrix[i][1:-1] = input()

    sur = 0
    for i in range(1, n+1):
        for j in range(1, m+1):
            if matrix[i][j] == 'W':
                area = 0 
                dfs(i, j)
                sur = max(sur, area)
    print(sur)
python
def dfs(matrix, row, col, visited):
    if row < 0 or row >= len(matrix) or col < 0 or col >= len(matrix[0]) \
            or matrix[row][col] != 'W' or visited[row][col]:
        return 0

    visited[row][col] = True
    size = 1

    for dr in [-1, 0, 1]:
        for dc in [-1, 0, 1]:
            size += dfs(matrix, row + dr, col + dc, visited)

    return size


def max_connected_area(matrix):
    max_area = 0
    visited = [[False for _ in range(len(matrix[0]))] for _ in range(len(matrix))]

    for row in range(len(matrix)):
        for col in range(len(matrix[0])):
            if matrix[row][col] == 'W' and not visited[row][col]:
                area = dfs(matrix, row, col, visited)
                max_area = max(max_area, area)

    return max_area


def main():
    T = int(input())
    for _ in range(T):
        N, M = map(int, input().split())
        matrix = [input().strip() for _ in range(N)]
        print(max_connected_area(matrix))


if __name__ == "__main__":
    main()