蓝桥杯24国赛python马与象(bfs标准模板)

废话少说,直接用bfs去遍历马和象走过的点,返回的是从起点到这个点的距离。

最后遍历下n*n个点,看看马和象都走过的点有哪些,再判断一下最小距离就可以了。时间复杂度是O(n*n),宽搜的时间复杂度也是这个。下面直接上代码:
 

from collections import deque

n,x1,y1,x2,y2=map(int,input().split())
size=n+1

#看图写出马的八个方向,象同理
horse_dirs=[(1,2),(1,-2),(2,1),(2,-1),(-1,2),(-1,-2),(-2,1),(-2,-1)]

ele_dirs=[(2,2),(2,-2),(-2,2),(-2,-2)]

def bfs(sx,sy,dirs):
  dist=[[-1]*(size) for _ in range(size)]
  q=deque()
  q.append((sx,sy))
  dist[sx][sy]=0

  while q:
    x,y=q.popleft()
    for dx,dy in dirs:
      nx,ny=x+dx,y+dy
      if 0<=nx<=n and 0<=ny<=n and dist[nx][ny]==-1:
        dist[nx][ny]=dist[x][y]+1
        q.append((nx,ny))
  return dist

horse_dist=bfs(x1,y1,horse_dirs)
ele_dist=bfs(x2,y2,ele_dirs)

res=float("inf")
#开始遍历马和象都有到达的点,找到两个人到达某点距离最小的那个

for i in range(n+1):
  for j in range(n+1):
    if horse_dist[i][j]!=-1 and ele_dist[i][j]!=-1:
      res=min(res,horse_dist[i][j]+ele_dist[i][j])
print(res)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值