一马当先------广度优先遍历

本文介绍了一个使用广度优先搜索(BFS)算法来解决马在特定大小的棋盘上从左下角到右上角最少步数的问题。通过定义马的移动规则为‘日’字型,并实现一个BFS算法来寻找最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

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


from collections import deque

def BFS(n,m):
	dx = [-1,-1,1,1,-2,-2,2,2]
	dy = [-2,2,-2,2,-1,1,-1,1]
	v = {(x,y):False for x in range(0,n+1) for y in range(0,m+1)}
	v[(0,0)] = True
	q = deque([(0,0,0)])
	while len(q)>0:
		p = q.pop()
		if p[0]==n and p[1]==m:
			return p[2]
		for i in range(0,8):
			x = p[0] + dx[i]
			y = p[1] + dy[i]
			if x>=0 and x<=n and y>=0 and y<=m and v[(x,y)]==False:
				v[(x,y)] = True
				q.append((x,y,p[2]+1))
	return -1
	
print BFS(3,3)
	
	


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值