[蓝桥杯python] 跳马:一个8×8的棋盘上有一个马初始位置为(a,b),他想跳到(c,d),问是否可以?如果可以,最少要跳几步?

[蓝桥杯python] 跳马

问题描述

1、资源限制

2、输入格式

3、输出格式

4、样式输入及输出

5、代码及解析

大功告成!编写不易,大家成功后点个关注or赞谢谢~~


问题描述

  一个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)

结果:

 


 自己写的所以有点复杂,但是至少能完成嘿嘿。如果各位有优化欢迎评论区讨论!!

大功告成!编写不易,大家成功后点个关注or赞谢谢~~


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Callme_TeacherPi℡

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值