【蓝桥杯】4535勇闯魔堡(多源BFS + 二分)

思路

k有一个范围(0到怪物攻击的最大值),求满足要求的k的最小值。很明显的二分套路。

关键是check函数怎么写,我们需要找到一条从第一行到最后一行的路径,每一次可以从上下左右四个方向前进,那么我么可以用BFS来查找是否存在。

这里还有一个思维上的关键点,在开始时我们可以随机选一个点出发,如果我们用遍历第一行满足要求的格子,用bfs依次判断,那么这题样例只能过60%。实际上只需把所有满足要求的格子都加入到deque,用多源dfs来一次性查找路径,才能通过所有样例。

code

用遍历第一行的写法只能通过60%的测试点,用多源bfs可以省去遍历的时间复杂度。

二分查找+普通BFS(测试样例通过12/20):

python 复制代码
import os
import sys
from collections import deque

def BFS(x,y,k):
  q = deque()
  q.append((x,y))
  vis = [[0 for i in range(m+1)] for j in range(n+1)]
  vis[x][y] = 1

  while len(q)!=0:
    x,y = q.popleft()
    if x == n:return True
    for dx,dy in [(-1,0),(1,0),(0,1),(0,-1)]:
      nx,ny = x+dx,y+dy
      if 1<=nx<=n and 1<=ny<=m and vis[nx][ny]==0:
        if a[nx][ny] > k:continue
        q.append((nx,ny))
        vis[nx][ny] = 1
  return False

def check(k):
  flag = False
  for i in range(1,m+1):
    if a[1][i]>k:continue
    if BFS(1,i,k):flag = True
  return flag

global n,m
n,m = map(int, input().split())
a = [[0 for i in range(m+1)]]
for _ in range(n):
  a.append([0]+list(map(int,input().split())))

l,r = 0,1001
ans = 0
while l<=r:
  mid = (l+r)//2
  if check(mid):
    ans = mid
    r = mid-1
  else:
    l = mid+1
print(ans)

二分查找+多源BFS(测试样例通过20/20):

python 复制代码
import os
import sys
from collections import deque

def BFS(q,vis,k):
  while len(q)!=0:
    x,y = q.popleft()
    if x == n:return True
    for dx,dy in [(-1,0),(1,0),(0,1),(0,-1)]:
      nx,ny = x+dx,y+dy
      if 1<=nx<=n and 1<=ny<=m and vis[nx][ny]==0:
        if a[nx][ny] > k:continue
        q.append((nx,ny))
        vis[nx][ny] = 1
  return False

def check(k):
  q = deque()
  vis = [[0 for i in range(m+1)] for j in range(n+1)]

  for j in range(1,m+1):
    if a[1][j]<=k:
      q.append((1,j))
      vis[1][j] = 1
  return BFS(q,vis,k)

global n,m
n,m = map(int, input().split())
a = [[0 for i in range(m+1)]]
for _ in range(n):
  a.append([0]+list(map(int,input().split())))

l,r = 0,1001
ans = 0
while l<=r:
  mid = (l+r)//2
  if check(mid):
    ans = mid
    r = mid-1
  else:
    l = mid+1
print(ans)
相关推荐
Dr.kangder4 小时前
嵌入式面试总结(十八)——JTAG调试
嵌入式硬件·面试·职场和发展·架构·嵌入式
Dr.kangder6 小时前
嵌入式面试总结(十六)——AMBA总线
面试·职场和发展·架构·嵌入式·虚拟化·总线
Dr.kangder7 小时前
嵌入式面试总结(十九)——内存泄露
单片机·算法·面试·职场和发展·架构·硬件架构
Dr.kangder7 小时前
嵌入式面试总结(十七)——DMA总线
面试·职场和发展·架构·嵌入式·总线
城管不管1 天前
重生——第九次面试2026.8.13某车一面
分布式·ai·面试·职场和发展·rabbitmq
琥珀色糖1 天前
leetcode hot100题(持续更新)移动零(双指针)
算法·leetcode·职场和发展·双指针·移动零
Dr.kangder1 天前
嵌入式面试总结(十四)——中断处理
单片机·面试·职场和发展·架构·硬件架构·嵌入式
Dr.kangder1 天前
嵌入式面试总结(十)——流水线
单片机·嵌入式硬件·面试·职场和发展·系统架构·嵌入式
淡海水1 天前
C#与常用数据结构源码剖析-全篇导览
开发语言·数据结构·unity·面试·职场和发展·c#
.道阻且长.2 天前
5.LeetCode算法习题讲解--双指针--有效三角形的个数
算法·leetcode·职场和发展