蓝桥杯——ALGO1001——跳马

这篇博客讨论了一道编程题,要求在8x8的范围内从起点通过‘日’字形跳跃到达终点,最少需要多少次跳跃。作者提出了DFS和BFS的思路,重点介绍了使用BFS的解决方案,通过一层一层地遍历来寻找最短路径。代码示例使用Java实现,同时也提到了Python代码存在的问题。博客强调了BFS在寻找最短路径时的优势,并提供了关键代码片段。
摘要由CSDN通过智能技术生成

大佬,牛!!!

  • 题目:给定四个数,a、b、c、d,分别是起点和终点,然后要求我们从起点开始,看看最少多少次条约能到达终点。其中每次跳跃都是一个“日”字形,并且在8*8的范围内部。最后如果不能到达,则直接返回-1。
  • 我的思路:我的基本思路就是dfs和bfs,但是不知道怎么判断最少。而且好久没有做图的题目了,属实是生疏了。
  • 大佬的思路:求最少的次数,就是从起点开始一层一层的剥。bfs,也就是广度优先,广度有限用队列,每次往八个方向走,类似一个队列的形式,这样我们就能一层的找。
  • 技巧:bfs,主要是记住bfs就是一层一层的剥。
  • 题目链接:http://lx.lanqiao.cn/problem.page?gpid=T2987

java代码

import java.util.LinkedList;
import java.util.Scanner;


/**
* @创建人 xcs
* @创建日期 2022/3/21
* @创建时间 19:56
* 题目链接:
*/
public class ALGO1001 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        int c = scanner.nextInt();
        int d = scanner.nextInt();
        if (a == c && b == d) {
            System.out.println(0);
            return;
        }
        // 可以走的路径
        int step[][] = {{1, 2}, {-1, -2}, {-1, 2}, {1, -2}, {2, 1}, {-2, -1}, {-2, 1}, {2, -1}};
        int[][] vis = new int[8][8];
        vis[a][b] = 1;
        LinkedList<Point> points = new LinkedList<>();
        points.add(new Point(a, b, 0));
        while (!points.isEmpty()) {
            Point point = points.removeFirst();
            if (point.x == c && point.y == d) {
                System.out.println(point.step);
                return;
            }
            for (int i = 0; i < 8; i++) {
                int nx = step[i][0] + point.x;
                int ny = step[i][1] + point.y;
                // 不越界并且没有遍历过
                if (nx < 9 && nx > 0 && ny < 9 && ny > 0 && vis[nx - 1][ny - 1] != 1) {
                    points.add(new Point(nx, ny, point.step + 1));
                    vis[nx - 1][ny - 1] = 1;
                }
            }
        }
        System.out.println(-1);
    }
}
// 点和到这个点的步数
class Point {
    int x, y, step;


    public Point(int x, int y, int step) {
        this.x = x;
        this.y = y;
        this.step = step;
    }
}
  • 总结:切记bfs是一层一层的剥离,也就是最快达到。附大佬链接,这个链接的代码是python的,并且好像存在错误。但是思路确实是没有问题的,就是在判断的时候存在一点问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值