P1443 马的遍历(BFS)

题目描述
有一个 n \times mn×m 的棋盘,在某个点 (x, y)(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

输入格式
输入只有一行四个整数,分别为 n, m, x, yn,m,x,y。

输出格式
一个n×m 的矩阵,代表马到达某个点最少要走几步(左对齐,宽 55 格,不能到达则输出 -1−1)。
输入输出样例
输入
3 3 1 1
输出
0 3 2
3 -1 1
2 1 4
对于全部的测试点,保证 在这里插入图片描述

思路分析
此题需要理解BFS,BFS模板

queue<> q;
q.push(初始状态)while(!q.empty()){
   
//记录下来队列中的队首元素的结点
	a=q.front();
	q.pop();
	//寻找队列中每一个结点对应的各种情况
	for(枚举a中的所有合法可达状态v){
   
		if(本状态合法){
   
			执行标记操作;
			q.push(v);//将新的情况放入队列![请添加图片描述](https://img-blog.csdnimg.cn/c8d564f37858487b80eeac90887a4cfd.png)

		}
	}
}

在这里插入图片描述

该题使用宽度搜索BFS,遍历从某一点开始 通过规则了解马走日,所以马的走法一共有八种利用dxx[]与dyy[]记录下马的行走方案。
利用BFS从起点添加进队列,并标记v[]为true,防止重复走过。利用两个队列记录起始结点入队,遍历起始节点所有走过的八种情况,符合条件的将a[][]数组该点的值进行更换 a[xx][yy]=a[q1.peek()][q2.peek()]+1;
并将该点入队,随后标记该点已经访问。
当八种情况全部遍历判断后,队列中的队首元素所有能走的情况已经入队,所以该结点已经无用,利用poll(),出队操作。
队列的特点:先入先出

Java题解

import java.util.*;
public class Main {
   
    static int n,m;
    static int bx,by;
    static int sum=0;
    static int dxx[]=new int[]{
   1,2,-1,-2,-2,-1,1,2};
    static int dyy[]=new int[]{
   2,1,2,1,-1,-2,-2,-1
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值