国庆七天乐,要猛! ——经典迷宫问题

简介: 国庆七天乐,要猛! ——经典迷宫问题

前言


      迷宫题目,总结于韩顺平老师所讲。


思路


1)先创建迷宫,使用二维数组表示,int[][] map = new int [8][7]

2)先规定 map 数组的元素值:0 ,障碍物:1

3)将最上面一行和最下面一行全部设置为1

4)将最左边一列和最右边一列全部设置为1

5)在方法中编写出出迷宫的路线


一、先创建迷宫


1)创建迷宫,使用二维数组表示,即 int[ ] [ ]  map = int [8] [7]


2)规定 map数组 的元素值:0,障碍物:1


3)将第一行和最后一行全部设置为 1


4)将第一列和最后一列全部设置为 1


5)设置两个障碍物 map[3] [1] = 1 和 map[3] [2] = 1


6)输出当前地图查看效果


8442aa7bd6ca42ffb216228109ea4f1f.png


代码演示

  int [][] map = new int[8][7];
  // 将最上面一行和最下面一行全部设置为1
  for(int i = 0; i < 7; i++) {
    map[0][i] = 1;
    map[7][i] = 1;
  }
  // 将最左边一列和最右边一列全部设置为1
  for(int i = 0; i < 7; i++) {
    map[i][0] = 1;
    map[i][6] = 1;
  }
  map[3][1] = 1;
  map[3][2] = 1;
    // 输出当前地图
  System.out.println("=====当前地图为=====");
  for(int i = 0; i < map.length; i++) {
    for(int j = 0; j < map[i].length; j++) {
      System.out.print(map[i][j] + " ");
    }
    System.out.println( );


输出效果为


8b8794fac20e447bb9d30e9f01ac8d97.png


二、在方法中使用递归回溯思想解决鼠鼠出迷宫


方法解读:


1)findWay为找出迷宫路径的方法名


2)如果找到,就返回 true ,否则返回 false


3)map 为二维数组,即表示迷宫


4)i,j 为鼠鼠的位置,初始化时的位置是(1 ,1)


5)因为是用递归的方法找路,所以要规定map数组各个值的含义(0 表示可以走的,1 表示障碍物,2 表示可以走,3 表示走不通的死路)


6)当 map[6] [5] = 2 时,就说明走出了迷宫,程序结束,否则将继续寻找


7)需要先确定找路的路线,下 => 右 => 上 => 左 (自定)


演示

class AA {
    public boolean findWay(int[][] map , int i , int j ) {
    if(map[6][5] == 2) {
      return true;
    } else {
      if(map[i][j] == 0) { // 当前这个位置为0,说明表示可以走通
        //假定会走通
        map[i][j] = 2;
        //使用找路策略,确定该位置是否可以真的走通
        //下 -> 右 -> 上 -> 左
        if(findWay(map , i + 1 , j)) { // 下
          return true;
        } else if(findWay(map , i , j + 1)) { // 右
          return true;
        } else if(findWay(map , i - 1 , j)) { // 上
          return true;
        } else if(findWay(map , i , j - 1)) { // 左
          return true;
        } else {
          map[i][j] = 3;
          return false;
        }
      } else { // map[i][j] = 1 , 2 , 3
        return false;
      }
    }
  }
}


三、代码 + 结果演示

public class MiGong {
  public static void main(String[] args) {
        int [][] map = new int[8][7];
    // 将最上面一行和最下面一行全部设置为1
    for(int i = 0; i < 7; i++) {
      map[0][i] = 1;
      map[7][i] = 1;
    }
    // 将最左边一列和最右边一列全部设置为1
    for(int i = 0; i < 7; i++) {
      map[i][0] = 1;
      map[i][6] = 1;
    }
    map[3][1] = 1;
    map[3][2] = 1;
    // 输出当前地图
    System.out.println("=====当前地图为=====");
    for(int i = 0; i < map.length; i++) {
      for(int j = 0; j < map[i].length; j++) {
        System.out.print(map[i][j] + " ");
      }
      System.out.println( );
    }
    AA a = new AA();
    a.findWay(map , 1 , 1); // 传参
    // 输出找路后的地图
    System.out.println("\n=====找路后的地图为=====");
    for(int i = 0; i < map.length; i++) {
      for(int j = 0; j < map[i].length; j++) {
        System.out.print(map[i][j] + " ");
      }
      System.out.println( );
    }
  }
} 
class AA {
    public boolean findWay(int[][] map , int i , int j ) {
    if(map[6][5] == 2) {
      return true;
    } else {
      if(map[i][j] == 0) { // 当前这个位置为0,说明表示可以走通
        //假定会走通
        map[i][j] = 2;
        //使用找路策略,确定该位置是否可以真的走通
        //下 -> 右 -> 上 -> 左
        if(findWay(map , i + 1 , j)) { // 下
          return true;
        } else if(findWay(map , i , j + 1)) { // 右
          return true;
        } else if(findWay(map , i - 1 , j)) { // 上
          return true;
        } else if(findWay(map , i , j - 1)) { // 左
          return true;
        } else {
          map[i][j] = 3;
          return false;
        }
      } else { // map[i][j] = 1 , 2 , 3
        return false;
      }
    }
  }
}


输出结果



d5c7ac47bd1f4e59aef518370513a3bb.png


其中,数字2代表的就是走出迷宫的路线。


四、更改路线后再次尝试


将路线 下 => 右 => 上 => 左 更改为 上 => 右 => 下 => 左

更改路线后总体代码不需要进行改变,只需要将方法中的路线判断语句更改即可:


if(findWay(map , i - 1 , j)) { // 上
  return true;
  } else if(findWay(map , i , j + 1)) { // 右
    return true;
  } else if(findWay(map , i + 1 , j)) { // 下
    return true;
  } else if(findWay(map , i , j - 1)) { // 左
    return true;
  } else {
    map[i][j] = 3;
    return false;
  }

更改路线后的路径图为:


75bafbca27e34f93ad242c14f79d3b46.png

五、测试回溯现象


测试回溯现象时,我们先要将map[2] [2] 处设上障碍物1 ,然后按照下 => 右 => 上 => 左(初始路线)进行运行即可。

演示结果:



f804f6b411494e12b3469df4ec9c8e80.png


可以发现在 map[2] [1] 处为 3 ,即代表是死路无法前进,所以出现了回溯的现象。


总结


       看懂不重要,重要的是要去做,只有自己会做了才代表学到手了。

       祝大家国庆快乐!

相关文章
|
8月前
|
存储 算法 数据可视化
Dijkstra算法在《庆余年》中的应用:范闲的皇宫之旅
Dijkstra算法在《庆余年》中的应用:范闲的皇宫之旅
|
7月前
|
开发者
【植物大战僵尸杂交版】致敬传奇游戏玩家——一个普通人的六年坚持
【植物大战僵尸杂交版】致敬传奇游戏玩家——一个普通人的六年坚持
【寒假每日一题】AcWing 4455. 出行计划
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 差分与前缀和
129 0
每日一题——找出游戏的获胜者
每日一题——找出游戏的获胜者
117 0
每日一题——找出游戏的获胜者
|
算法 机器人 程序员
【算法集训 | 暑期刷题营】8.8题---计算几何
【算法集训 | 暑期刷题营】8.8题---计算几何
【算法集训 | 暑期刷题营】8.8题---计算几何
|
JavaScript BI
【蓝桥杯集训·周赛】AcWing 第96场周赛
文章目录 第一题 AcWing 4876. 完美数 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4877. 最大价值 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4878. 维护数组 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
94 0
|
存储 机器学习/深度学习 人工智能
【蓝桥杯集训·周赛】AcWing 第 95 场周赛
文章目录 第一题 AcWing 4873. 简单计算 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4874. 约数 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4875. 整数游戏 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
132 0
|
存储 机器学习/深度学习 人工智能
【蓝桥杯集训·周赛】AcWing 第94场周赛
文章目录 第一题 AcWing 4870. 装物品 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4871. 最早时刻 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4872. 最短路之和 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
86 0
|
存储 人工智能 算法
【蓝桥杯集训·最后一次周赛】AcWing 第 97 场周赛
文章目录 第一题 AcWing 4944. 热身计算 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4945. 比大小 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4946. 叶子节点 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
146 0
|
存储 人工智能 JavaScript
【寒假每日一题】AcWing 4510. 寻宝!大冒险!
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
145 0