当前位置:   article > 正文

蓝桥杯 - 走迷宫

蓝桥杯 - 走迷宫

解题思路:

经典dfs题目,需要重点掌握。

养成好习惯,静态方法都要用到的变量提前想到定义为静态常量。

  1. import java.util.Scanner;
  2. public class Main {
  3. //注意加static,经常忘记导致编译错误
  4. static int N, M, x1, x2, y1, y2, min = Integer.MAX_VALUE;
  5. static int[][] a, v;
  6. public static void main(String[] args) {
  7. Scanner scan = new Scanner(System.in);
  8. N = scan.nextInt();
  9. M = scan.nextInt();
  10. // 初始化网格,注意题目条件,出发点和终点的坐标都是从1开始,所以我们的下标不能像往常一样从0开始
  11. a = new int[N + 1][M + 1];
  12. //初始化记录最少步数的访问数组
  13. v = new int[N + 1][M + 1];
  14. for (int i = 1; i <= N; i++) {
  15. for (int j = 1; j <= M; j++) {
  16. a[i][j] = scan.nextInt();
  17. //赋最大值,代表没有被访问过
  18. v[i][j] = Integer.MAX_VALUE;
  19. }
  20. }
  21. x1 = scan.nextInt();
  22. y1 = scan.nextInt();
  23. x2 = scan.nextInt();
  24. y2 = scan.nextInt();
  25. dfs(0, x1, y1);
  26. // 如果找不到路径,则输出-1,否则输出最短路径长度
  27. if (min == Integer.MAX_VALUE) {
  28. min = -1;
  29. }
  30. System.out.println(min);
  31. }
  32. public static void dfs(int step, int x, int y) {
  33. v[x][y] = step;
  34. if (x == x2 && y == y2) {
  35. min = Math.min(min, step);
  36. return;
  37. }
  38. // 方向数组
  39. int[] dx = { 1, -1, 0, 0 };
  40. int[] dy = { 0, 0, 1, -1 };
  41. // 尝试向四个方向搜索
  42. for (int i = 0; i < 4; i++) {
  43. int xx = x + dx[i];
  44. int yy = y + dy[i];
  45. //注意v[x][y] + 1 < v[xx][yy],我们继续dfs的前提是v[xx][yy]没有被访问,
  46. //或当前路径长度加1到达v[xx][yy]后比v[xx][yy]本身的路径更短
  47. if (xx > 0 && yy > 0 && xx <= N && yy <= M && v[x][y] + 1 < v[xx][yy] && a[xx][yy] == 1) {
  48. dfs(step + 1, xx, yy);
  49. }
  50. }
  51. }
  52. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/374389
推荐阅读
相关标签
  

闽ICP备14008679号