题目描述:
下过象棋的人都知道,马只能走’日’字形(包括旋转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)