资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
一个8×8的棋盘上有一个马初始位置为(a,b),他想跳到(c,d),问是否可以?如果可以,最少要跳几步?
输入格式
一行四个数字a,b,c,d。
输出格式
如果跳不到,输出-1;否则输出最少跳到的步数。
样例输入
1 1 2 3
样例输出
1
数据规模和约定
0<a,b,c,d≤8且都是整数。
问题分析:既然寻求最短路径,就该想到BFS算法,广度搜素,采用队列的特点进行同步搜索。
代码如下:
from collections import deque
##二维列表模拟棋盘,外面两层1防止索引超出范围
l=[
[1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,0,0,0,0,0,0,0,0,1,1],
[1,1,0,0,0,0,0,0,0,0,1,1],
[1,1,0,0,0,0,0,0,0,0,1,1],
[1,1,0,0,0,0,0,0,0,0,1,1],
[1,1,0,0,0,0,0,0,0,0,1,1],
[1,1,0,0,0,0,0,0,0,0,1,1],
[1,1,0,0,0,0,0,0,0,0,1,1],
[1,1,0,0,0,0,0,0,0,0,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1]
]
##八个方向
dirs=[
lambda x,y:(x+1,y+2),
lambda x,y:(x+1,y-2),
lambda x,y:(x+2,y+1),
lambda x,y:(x+2,y-1),
lambda x,y:(x-1,y+2),
lambda x,y:(x-1,y-2),
lambda x,y:(x-2,y+1),
lambda x,y:(x-2,y-1),
]
##计算步数
def counters(path):
now_node=path[-1]
real_path=[]
while now_node[2] != -1:
real_path.append(now_node[:2])
now_node = path[now_node[2]]
real_path.append(now_node[:2])
real_path.reverse()
return(len(real_path)-1)
##搜索
def qipan_find(x1,y1,x2,y2):
queue=deque()##建立队列
queue.append((x1+1,y1+1,-1))##保存坐标和源节点的位置
path=[]#保存走过的节点
while len(queue)>0:
now_node = queue.popleft()###起点
path.append(now_node)
if now_node[0] == x2+1 and now_node[1] == y2+1:##走到终点
print(counters(path))
return True
for dir in dirs:##沿着八个方向进行搜索
next_node=dir(now_node[0],now_node[1])
if l[next_node[0]][next_node[1]]==0:
queue.append((next_node[0],next_node[1],len(path)-1))
l[next_node[0]][next_node[1]] =2##标记已经搜索过
else:
l[now_node[0]][now_node[1]] = 2
else:##找不到
print('-1')
return False
a,b,c,d=list(map(int,input().split()))
qipan_find(a,b,c,d)
结果: