[算法]马走日

通过广度优先搜索BFS解决马走日问题,保证找到最短路径。利用字典记录每个位置的上一步,从起点开始,将相邻坐标加入队列,逐个访问,直到找到目标。当访问到目标时输出步数和路径。

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

题目描述:
在国际象棋中,马的走法与中国象棋类似,即俗话说的“马走日”,下图所示即国际象棋中马每一步能到达的格子(箭头所指为每步到达位置)。

现有一200 * 200大小的国际象棋棋盘,棋盘中仅有一个马,给定马的当前位置和目标位置,求出马最少需要多少跳才能从当前位置到达目标位置。

输入格式:已有文件txt格式
文件里每一行有四个以空格分隔的整数,分别表示马当前位置及目标位置的横、纵坐标(Xs,Ys)和(Xe,Ye)。坐标由0开始。

文件输入样例:
1 1 2 1
1 5 5 1
输入说明
第一行:马的当前位置为(1,1),目标位置为(2,1)。
第二行:马的当前位置为(1,5),目标位置为(5,1)。
输出:
文件里每一行第一个数字为1个整数,即马从当前位置跳到目标位置最少的跳数,然后以空格隔开,输出对应的最短路径坐标,坐标格式为(X, Y),每个坐标之间以空格隔开。所有路径输出后以回车换行。
输出样例:
3 (1, 1) (3, 2) (4, 0) (2, 1)
4 (1, 5) (2, 3) (4, 2) (6, 3) (5, 1)
第一行:马需要跳3次才可以从(1,1)到(2,1),对应的路径为(1, 1) (3, 2) (4, 0) (2, 1)。
第二行:马需要跳4次才可以从(1,5)到(5,1),对应的路径为(1, 5) (2, 3) (4, 2) (6, 3) (5, 1)。

解题:对于这类问题,可以用广度优先BFS,或者深度优先算法DFS,如果采用深度优先算法DFS,则需要在所有的路径中找最短的路径。如果采用广度优先BFS算法,由于BFS的特点,保证是最短路径,再加上一个字典表来记录每一个位置的上一步(父亲)

用队列存储将要访问的坐标,每访问一个坐标,标记并把8个方向的坐标也加入到队列中,利用队列的FIFO特性依次访问,直到队列为空

思路如下:

1.输入为起点位置start(Xs,Ys),终点为target(Xe,Ye)

2.建立一个n*n(200*200)的数组用来记录每一个坐标是否被访问过

3.从起点开始访问它的八个相邻方向,count+1,同时记录这8个方向的前一步(父节点):

  标记该坐标为访问过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值