废话少说,直接用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)