n行m列网络棋盘,棋子只能走日字形,从左下角至少需要几步可以移动到棋盘的右上角?
题目来源:http://www.pythontip.com/codi...
问题描述:
下过象棋的人都知道,马只能走'日'字形(包括旋转90°的日),现在想象一下,给你一个n行m列网格棋盘,棋盘的左下角有一匹马,请你计算至少需要几步可以将它移动到棋盘的右上角,若无法走到,则输出-1.如n=1,m=2,则至少需要1步;若n=1,m=3,则输出-1。
思路:
马走日,从某一点开始走,一共有8种走法:
题目要求从左下走到右上,那么能用上的就是坐标轴第一和第四象限的4种走法,需要根据实际位置判断马下一步怎么走,而且走的总步数最少,需要使用广度优先遍历从某一步到下一步的所有走的路径,还需要记录步长,考虑最短路径。 算法能力比较差,代码的具体编写没写出来。
这是关于这道题的解题报告:http://www.pythontip.com/codi...
里面的思路有给广度优先加剪枝的,还有用向量的,但是有4层for循环复杂度太高。
希望可以帮忙分析下这道题,谢谢大家。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
既然是计算最小步数,确实是可以使用广度优先的算法来计算。如果你不太了解广度优先算法具体是什么,建议先google了解算法。
Q
存储待访问的点,一个map记录访问过的点visited[maxL][maxH]
,起始点为vs=[0,0,0]
0,1两点记录坐标,2点记录index步长, 结束点为vd=[n,m], Q.append(vs), 把起始点丢进队列里。dx=[1,1,2,2,-1,-1,-2,-2], dy=[2,-2,1,-1,2,-2,1,-1]
while Q:
只要有未访问的点,就执行循环。vn=Q.pop(0)
, 取出队列第一个点并抛掉,if [vn[0],vn[1]] == vd: return vn[2]
如果发现此点就是想要的点,直接返回index步长,得到结果。return -1
方法仅供参考,虽然过了你那个题目的测试。