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()