文章目录
- Question
- Ideas
- Code
Question
你有一张某海域 N×N 像素的照片,”.”表示海洋、”#”表示陆地,如下所示:
…
.##…
.##…
…##.
…####.
…###.
…
其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就有 2 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。
具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
…
…
…
…
…#…
…
…
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
输入格式
第一行包含一个整数N。
以下 N 行 N 列,包含一个由字符”#”和”.”构成的 N×N 字符矩阵,代表一张海域照片,”#”表示陆地,”.”表示海洋。
照片保证第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。
输出格式
一个整数表示答案。
数据范围
1≤N≤1000
输入样例1:
7
…
.##…
.##…
…##.
…####.
…###.
…
输出样例1:
1
输入样例2:
9
…
.##.##…
.#####…
.##.##…
…
.##.#…
.#.###…
.#…#…
…
输出样例2:
1
Ideas
dfs实现flood fill算法,这个算法能找到所有的连通块(在这里指的就是岛屿),然后判断连通块里面的陆地数量和临海陆地数量,如果这俩相等那么岛屿消失。
Code
n = int(input())
lis = []
for i in range(n):
lis.append(input().strip())
dx = [0,0,-1,1]
dy = [1,-1,0,0]
def bfs(sx,sy):
q = [(sx,sy)]
land = 0
bound = 0
stat[sx][sy] = 1
while q:
t = q.pop(0)
land += 1
is_bound = False # 默认该陆地并不临海(四个方向)
for i in range(4):
x = t[0] + dx[i]
y = t[1] + dy[i]
if x<0 or x>=n or y<0 or y>=n: # 越界
continue
if lis[x][y] == '.':
is_bound = True
continue
if stat[x][y]:
continue
stat[x][y] = 1
q.append((x,y))
if is_bound:
bound += 1
return land,bound
cnt = 0
# 找连通块,这里指的是岛屿
stat = [[0 for i in range(n+10)] for j in range(n+10)] # 0代表未经过,1代表经过
for i in range(n):
for j in range(n):
if not stat[i][j] and lis[i][j] == '#':
land,bound = bfs(i,j)
if land == bound:
cnt += 1
print(cnt)