题目描述
你有一张某海域 NxNNxN 像素的照片,"."表示海洋、"#"表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
输入描述
第一行包含一个整数 N\ (1 \leq N \leq 1000)N (1≤N≤1000)。
以下 NN 行 NN 列代表一张海域照片。
照片保证第 1 行、第 1 列、第 NN 行、第 NN 列的像素都是海洋。、
输出一个整数表示答案。
输入输出样例
示例
输入
7
.......
.##....
.##....
....##.
..####.
...###.
.......
输出
1
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
from collections import *
def bfs(x,y):
global flag
q=deque()
dirs=[(1,0),(0,1),(-1,0),(0,-1)] #四个方向
vis[x][y]=1
q.append((x,y))
while q:
t=q.popleft()
tx,ty=t[0],t[1]
if map[tx][ty+1]=='#' and map[tx][ty-1]=='#' and map[tx+1][ty]=='#' and map[tx-1][ty]=='#': #搜一个点的四周
flag=1 #如果四周都有陆地,那么这是一个高地,不会被淹没
for i in range(4): #扩展(tx,ty)的四个邻居
nx=tx+dirs[i][0]
ny=ty+dirs[i][1]
if vis[nx][ny]==0 and map[nx][ny]=='#':
q.append((x,y))
vis[nx][ny]=1 #标记点
n=int(input())
ans=0 #统计被淹没岛的数量
map=[] #地图
for i in range(n):
map.append(list(input()))
vis=[[0]*n for _ in range(n)] #标记是否被搜过
for i in range(n): #bfs所有的点
for j in range(n):
if vis[i][j]==0 and map[i][j]=='#':
flag=0 #假设这个岛被淹
bfs(i,j) #找这个岛中是否有高地
if flag==0:
ans+=1
print(ans)