【BFS题型四/填充/全局变量】全球变暖

精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课

# BFS-全球变暖
from collections import deque

n = int(input())
M = [[i for i in input()] for j in range(n)]
vis = [[0] * n for i in range(n)]  # 标记列表
flag = True  # 淹没标志


def bfs(x, y):
    flag=True
    q = deque([(x, y)])  # 初始化开始遍历的坐标
    while q:
        x, y = q.popleft()
        if M[x][y + 1] == '#' and M[x][y - 1] == '#' and M[x + 1][y] == '#' and M[x - 1][y] == '#':
            flag = False  # 如果格子的四个方向有岛屿,中间的高地不会被淹没
        for i, j in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
            a, b = x + i, y + j
            if vis[a][b] == 0 and M[a][b] == '#':
                vis[a][b] = 1  # 标记岛屿遍历过了
                q.append((a, b))  # 遍历下一个岛屿
    return flag

ans = 0
for i in range(n):  # 遍历每一个格子
    for j in range(n):
        if vis[i][j] == 0 and M[i][j] == '#':
            flag = True  # 设置淹没标志
            if bfs(i, j):  # 搜索这个格子,判断是否需要更改淹没标志
                ans += 1

print(ans)
'''
样例输入:
7
.......
.##....
.##....
....##.
..####.
...###.
.......
样例输出:
1
'''

定义全局变量型

#BFS-全球变暖
from collections import deque
n=int(input())
M=[[i for i in input()]for j in range(n)]
vis=[[0]*n for i in range(n)]   #标记列表
flag=True                       #淹没标志
def bfs(x,y):
    global flag
    q=deque([(x,y)])            #初始化开始遍历的坐标
    while q:
        x,y=q.popleft() 
        if M[x][y+1]=='#' and M[x][y-1]=='#' and M[x+1][y]=='#' and M[x-1][y]=='#':
            flag=False          #如果格子的四个方向有岛屿,中间的高地不会被淹没
        for i,j in [(0,1),(0,-1),(1,0),(-1,0)]:
            a,b=x+i,y+j
            if vis[a][b]==0 and M[a][b]=='#':
                vis[a][b]=1     #标记岛屿遍历过了
                q.append((a,b)) #遍历下一个岛屿
ans=0
for i in range(n):              #遍历每一个格子
    for j in range(n):
        if vis[i][j]==0 and M[i][j]=='#':
            flag=True           #设置淹没标志
            bfs(i,j)            #搜索这个格子,判断是否需要更改淹没标志
            if flag==True:      #如果淹没标志不变
                ans+=1          #被淹岛屿数量加1
 
print(ans)
'''
样例输入:
7
.......
.##....
.##....
....##.
..####.
...###.
.......
样例输出:
1
'''

涂色解法,只有44分拉了

注意列表的复制,不能使其同时指向的地址相同。

应该用标记列表的,这种对原迷宫列表进行修改来防止重复访问的手法太sb了,,,之前的涂色章节只有用于单独求解数量时好用。

from collections import deque
n=int(input())
mg=[]
mg1=[]
for i in range(n):
    list1=list(input())
    mg.append(list1)
    mg1.append(list1.copy())#只能这样复制
# mg1=mg.copy(), 地址指针一样不行
vis=[[0]*n for i in range(n)]

def bfs1(sx,sy,l):#计算岛屿数量
    q=deque([(sx,sy)])
    while q:
        nows=q.popleft()
        x,y=nows[0],nows[1]
        for dx, dy in [(0, 1), (1, 0), (0, -1), (-1, 0)]:
            nx = dx + x
            ny = dy + y
            if 0 <= nx < n and 0 <= ny < n and l[nx][ny] == '#':
                l[nx][ny] = '.'
                q.append((nx,ny))

def bfs(nows,l):#进行岛屿覆盖
    x,y=nows[0],nows[1]
    for dx,dy in [(0,1),(1,0),(0,-1),(-1,0)]:
        nx=dx+x
        ny=dy+y
        if 0<=nx<n and 0<=ny<n and vis[nx][ny]!=1 and l[nx][ny]=='.':
            l[x][y]='.'
            vis[x][y]=1
            return


res1=0
for i in range(n):
    for j in range(n):
        if mg1[i][j]=='#':
            mg1[i][j]='.'
            bfs1(i,j,mg1)
            res1+=1

for i in range(n):
    for j in range(n):
        if mg[i][j]=='#':
            bfs([i,j],mg)

# for i in range(n):
#     print(mg[i])
res2=0
for i in range(n):
    for j in range(n):
        if mg[i][j]=='#':
            mg[i][j] = '.'
            bfs1(i,j,mg)
            res2+=1

print(res1-res2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值