[蓝桥杯python] 跳马
问题描述
一个8×8的棋盘上有一个马初始位置为(a,b),他想跳到(c,d),问是否可以?如果可以,最少要跳几步?
1、资源限制
资源限制
时间限制:1.0s 内存限制:256.0MB
2、输入格式
一行四个数字a,b,c,d。
3、输出格式
如果跳不到,输出-1;否则输出最少跳到的步数。
4、样式输入及输出
样例输入
1 1 2 3
样例输出
1
5、代码及解析
具体解析请大家自己看一下代码中的备注,在此不多做解释。
(基本思路是使用DFS算法)
a,b,c,d = map(int,input().split())
#因为马走'日'字,所以可以跳8个方向,一次列出来
hourse = [[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2],[1,2]]
#记录最小步数
min_step = float("inf")
#创建一个棋盘,为什么是9X9呢,因为可以与坐标对应且记录是否已经走过
visited = [[0 for _ in range(9)] for _ in range(9)]
#开始定义DFS函数
def DFS(x,y,step):
global min_step,visited
#此处剪枝操作,只要比记录过的最小步数大的就不再遍历,减少搜索次数
if step > min_step:
return
#终止条件,只要到了预期的坐标就结束
if x ==c and y ==d:
min_step = step
return
#分别便利hourse里面的8个坐标,搜索每一个都可以到的位置
for i in range(8):
x_new = x + hourse[i][0]
y_new = y + hourse[i][1]
if x_new > 0 and x_new <= 8 and y_new > 0 and y_new <= 8:
#记录走过的地方,不重复
if visited[x_new][y_new] == 0:
visited[x_new][y_new] = 1
DFS(x_new,y_new,step+1)
visited[x_new][y_new] = 0
#初始化(a,b)为已访问
visited[a][b] = 1
DFS(a,b,0)
#如果没有返回步数则走不到,返回-1
if min_step == float("inf"):
print(-1)
else:
print(min_step)
结果:
自己写的所以有点复杂,但是至少能完成嘿嘿。如果各位有优化欢迎评论区讨论!!