大佬,牛!!!
- 题目:给定四个数,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的,并且好像存在错误。但是思路确实是没有问题的,就是在判断的时候存在一点问题。