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

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

前言


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


思路


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


总结


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

       祝大家国庆快乐!

相关文章
|
3月前
滑雪(蓝桥模拟赛的题)
滑雪(蓝桥模拟赛的题)
27 0
|
4月前
滑雪(也是蓝桥模拟赛的题)
和蓝桥杯模拟赛的最大连通过差不多一个思想
22 0
|
8月前
|
存储 算法 NoSQL
膜拜!砍下13个大厂Offer神仙案例! | 彭文华
膜拜!砍下13个大厂Offer神仙案例! | 彭文华
|
Android开发
LeetCode 双周赛 98,脑筋急转弯转不过来!
大家好,我是小彭。 昨晚是 LeetCode 第 98 场双周赛,你参加了吗?这场周赛需要脑筋急转弯,转不过来 Medium 就会变成 Hard,转得过来就变成 Easy。
67 0
|
前端开发 小程序 Java
1024特刊|要不是家里穷,我也不想当码农
三掌柜有一句说的好:要不是家里穷,我也不想当码农;要不是家里没矿,我也不想四处流浪。
619 1
1024特刊|要不是家里穷,我也不想当码农
|
机器学习/深度学习 算法 测试技术
面试官在“逗”你系列:到底应该怎么爬楼梯?! | 牛气冲天新年征文
算法题是在面试过程中考察候选人逻辑思维能力、手写代码能力的一种方式,因为有一句古话说的好:“说一千道一万,不如写段代码看一看”。今天我们就来个单刀直入,直奔主题,从一个真实面试题到底怎么爬楼梯来聊一聊算法中的动态规划 。
168 0
|
编译器 Python
圣诞节来了,怎能还没有圣诞树呢 快来为心爱的她送上专属的圣诞礼物叭~
圣诞节来了,怎能还没有圣诞树呢 快来为心爱的她送上专属的圣诞礼物叭~
134 0
圣诞节来了,怎能还没有圣诞树呢 快来为心爱的她送上专属的圣诞礼物叭~
|
数据采集 传感器 人工智能
拆车、炸机、毁魔方,这个疯狂的算法竞赛少年目的是这样的…
拆车、炸机、毁魔方,这个疯狂的算法竞赛少年目的是这样的…
拆车、炸机、毁魔方,这个疯狂的算法竞赛少年目的是这样的…
|
弹性计算 关系型数据库 MySQL
南小鸟和他的学习日记
一个人的视力本有两种功能;一个是向外去,无限宽广地拓展世界;另一个是向内来,无限深刻地去发现内心
南小鸟和他的学习日记