当前位置:   article > 正文

蓝桥杯:走迷宫_java蓝桥杯中关于迷宫的问题

java蓝桥杯中关于迷宫的问题

目录

题目描述

输入描述

输出描述

输入输出样例

题目分析:(BFS)

AC代码(Java): 


题目描述

给定一个N×M 的网格迷宫 G。G 的每个格子要么是道路,要么是障碍物(道路用 1 表示,障碍物用 0 表示)。

已知迷宫的入口位置为 (x1​,y1​),出口位置为(x2​,y2​)。问从入口走到出口,最少要走多少个格子。

输入描述

输入第 1 行包含两个正整数 N,M分别表示迷宫的大小。

接下来输入一个N×M 的矩阵。若G(x,y) = 1 表示其为道路,否则表示其为障碍物。

最后一行输入四个整数x1​,y1​,x2​,y2​,表示入口的位置和出口的位置。

数据范围:1≤N,M≤100, 0≤G(x,y)≤1,  1≤x1,y1≤N, 1≤x2,y2≤N 

输出描述

输出仅一行,包含一个整数表示答案。

若无法从入口到出口,则输出 −1。

输入输出样例

输入 

  1. 5 5
  2. 1 0 1 1 0
  3. 1 1 0 1 1
  4. 0 1 0 1 1
  5. 1 1 1 1 1
  6. 1 0 0 0 1
  7. 1 1 5 5

输出 

8

题目分析:(BFS

         这种看题目,一般DFS用来搜索可行解,BFS搜索最优解。题目要我们算最短路径,那么我们用BFS(DFS也行,就是要额外处理,因为对DFS来说,100*100数据量大,容易超时)

        1.BFS搜索三要素嘛,(1)将起始点进入队列,(2)然后依次将可以行走的方向加入队列,(3)更新步数(因为BFS每次搜索其实都是在寻找最优解的道路,每一步搜索都是一个最优解的坐标)

        2.因为我们这个是数组,要将属性添加到队列里面来访问,那我们就创造一个节点,节点里面存放该点的坐标和步数(即第几步能走到这里)

        3.然后不断搜索,如果搜索到终点,那么就更新result(result初始化为-1),也就是如果搜索完成,都没有更新result的话,就肯定不能走到终点。

        4.我们最后直接输出result即可

        PS:我尝试了常规的DFS搜索,拿不满分,后面的测试用例数据大了会超时,所以还是用了BFS来做。

AC代码(Java): 

  1. import java.util.*;
  2. // 1:无需package
  3. // 2: 类名必须Main, 不可修改
  4. //开一个节点,节点里面存放坐标信息和步数信息(步数存放最短几步可以走到终点)
  5. class Node{
  6. int row;
  7. int col;
  8. //步数
  9. int step;
  10. public Node(int row,int col,int step) {
  11. this.row = row;
  12. this.col = col;
  13. this.step = step;
  14. }
  15. }
  16. public class Main {
  17. public static void main(String[] args) {
  18. Scanner scan = new Scanner(System.in);
  19. //在此输入您的代码...
  20. int N = scan.nextInt();
  21. int M = scan.nextInt();
  22. //迷宫
  23. int[][] map = new int[N][M];
  24. //拿到迷宫数据
  25. for(int i = 0;i<N;i++) {
  26. for(int j = 0;j<M;j++) {
  27. map[i][j] = scan.nextInt();
  28. }
  29. }
  30. //分别拿到起始坐标和终点坐标(因为题目是从第一行开始的,但是我们数组下标是从0开始,那么我们就让他-1,跟数组保持一致)
  31. int startRow = scan.nextInt()-1;
  32. int startCol = scan.nextInt()-1;
  33. int endRow = scan.nextInt()-1;
  34. int endCol = scan.nextInt()-1;
  35. scan.close();
  36. //创建初始坐标节点,步数为0
  37. Node node = new Node(startRow,startCol,0);
  38. //队列进行搜索
  39. Queue<Node> queue = new LinkedList<>();
  40. queue.offer(node);
  41. int result = -1;
  42. //强行修改起始坐标为1(TMD,为什么起始点如果是0也能走到终点?)
  43. map[startRow][startCol] = 1;
  44. while(!queue.isEmpty()) {
  45. //取出节点类用来查找
  46. Node root = queue.poll();
  47. //判断是否达到终点
  48. if(root.row==endRow && root.col==endCol) {
  49. //能搜索到终点,直接结束循环
  50. result = root.step;
  51. break;
  52. }
  53. //该节点满足能够行走的条件(即为1)
  54. if(map[root.row][root.col] == 1) {
  55. //因为广搜能搜索到的一般都是最优解,所以我们直接步数++;
  56. root.step++;
  57. //走过该节点之后标记为已经走过(因为障碍物不可走,那么我们也将走过的路修改成障碍物就行)
  58. map[root.row][root.col] = 0;
  59. //其余节点依次入队,我按照顺时针来走(右下左上)
  60. if(root.col+1<M && map[root.row][root.col+1]==1) {
  61. //将可以走的方向放入队列
  62. Node rootNode = new Node(root.row, root.col+1,root.step);
  63. queue.offer(rootNode);
  64. }
  65. if(root.row+1<N && map[root.row+1][root.col]==1) {
  66. Node rootNode = new Node(root.row+1, root.col,root.step);
  67. queue.offer(rootNode);
  68. }
  69. if(root.col>0 && map[root.row][root.col-1]==1) {
  70. Node rootNode = new Node(root.row, root.col-1,root.step);
  71. queue.offer(rootNode);
  72. }
  73. if(root.row>0 && map[root.row-1][root.col]==1) {
  74. Node rootNode = new Node(root.row-1, root.col,root.step);
  75. queue.offer(rootNode);
  76. }
  77. }
  78. }
  79. System.out.println(result);
  80. }
  81. }

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

闽ICP备14008679号