题目描述
有一个 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