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

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

前言


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


思路


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 ,即代表是死路无法前进,所以出现了回溯的现象。


总结


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

       祝大家国庆快乐!

目录
打赏
0
0
0
0
0
分享
相关文章
七夕快到了,来创造一副浪漫的鹊桥插画吧
本次通过加载和推理SD模型对象存储OSS Bucket,挂载到PAI-EAS服务,实现模型部署,加载和推理SD模型,制作属于自己的七夕画作。
第320场周赛赛后分析总结(前三题)
前言 几个星期没打周赛,手感生疏了好多,果然算法题还是得勤加练习,多找适应比赛的感觉。 同时,第二、三题都是图和树相关的内容,像我这种对这个专题还不熟的也可以借此机会巩固一下。
110 0
周赛313赛后做题分析及总结
本文为力扣周赛313赛后做题分析及总结。
113 0
黑镜狗再现!波士顿动力「大黄狗」上岗SpaceX,勘察火箭爆炸现场
近日,SpaceX星际飞船爆炸现场上演了如同「黑镜」中的一幕。一只来自波士顿动力的「大黄狗」在星舰原型SN10爆炸现场附近巡逻,并帮助工人清理和回收火箭零部件。这一场景引来众多网友围观,称其为黑镜狗。
180 0
黑镜狗再现!波士顿动力「大黄狗」上岗SpaceX,勘察火箭爆炸现场
阿里云梁楹:这样的青春,别样的精彩
人的青春应该怎样度过?相信一千个人心中,有一千个答案。 我是郭嘉梁,花名梁楹,在不少人眼中,我是一个来自北方的大男孩,一个自带“古典气质的少年”,其实我是一个喜欢晋级打怪,热爱挑战自我的阿里云工程师。
城市 | 800个地铁站数据透析的京沪白领图鉴:隐形土豪、无产中产阶级和猪猪女孩
我们比较了名媛、金融精英、互联网新贵们在京沪的生存状况,一一决出了胜负——上海南京西路的名媛过得更精致,但北京的金融精英们才是真的壕,互联网新贵们在北京更可以事业生活双丰收。
2249 0
解救被困传销女演员 助人减肥找老婆 蚂蚁森林又现神功能
近日,一篇《女演员被传销组织拘禁30多天 竟因蚂蚁森林幸运逃离》的报道引发了全网热议。网友纷纷表示:蚂蚁森林功能强大,不仅能帮人减肥、找老婆,还能在关键时刻保命!
5472 0