第24题:一马当先

题目描述:
下过象棋的人都知道,马只能走’日’字形(包括旋转90°的日),现在想象一下,给你一个n行m列网格棋盘, 棋盘的左下角有一匹马,请你计算至少需要几步可以将它移动到棋盘的右上角,若无法走到,则输出-1. 如n=1,m=2,则至少需要1步;若n=1,m=3,则输出-1。

示例:
输入:
n = 1 m = 2

输出:
1

思路:广度优先遍历,和走迷宫题目类似,不过这里每步有8种走法。

step = [[0 for x in range(m + 1)] for y in range(n + 1)]  # 到该点所走步数
step[0][0] = 0  # 起点
dx = [1, -1, 1, -1, 2, -2, 2, -2]
dy = [2, -2, -2, 2, 1, -1, -1, 1]
inq = [[0 for x in range(m + 1)] for y in range(n + 1)]  # 入队标记
Q = []
Q.append([0, 0])


def judge(x, y):
    if x < 0 or x > n or y < 0 or y > m:
        return False
    if inq[x][y]:  # 已经入过队
        return False
    else:
        return True


while (Q):
    top = Q[0]  # 取出队首元素
    del Q[0]  # 队首元素出队
    if top[0] == n and top[1] == m:  # 到达右上角
        break
    for i in range(8):
        newX = top[0] + dx[i]
        newY = top[1] + dy[i]
        if judge(newX, newY):
            step[newX][newY] = step[top[0]][top[1]] + 1
            inq[newX][newY] = 1
            Q.append([newX, newY])
if step[n][m]:
    print(step[n][m])
else:
    print(-1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值