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

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

前言


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


思路


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
分享
相关文章
京东商品价格和评论的数据采集监控系统
对于一个商品来说,其价格在其生命周期内几乎不可能一成不变,很多消费者需要在商品价格低于心理预期时及时收到通知,然后有概率产生购买行为,虽然这种功能可能已经在京东或者淘宝上实现了,但是对于消费者来说,知道整个周期内的具体价格变化情况也很重要,这就是商品价格监控的一个意义所在。
【MySQL基础篇】盘点MySQL常用四大类函数
本文介绍了MySQL中的四大类常用函数:字符串函数、数值函数、日期函数和流程函数。
【MySQL基础篇】盘点MySQL常用四大类函数
探索阿里云 Flink 物化表:原理、优势与应用场景全解析
阿里云Flink的物化表是流批一体化平台中的关键特性,支持低延迟实时更新、灵活查询性能、无缝流批处理和高容错性。它广泛应用于电商、物联网和金融等领域,助力企业高效处理实时数据,提升业务决策能力。实践案例表明,物化表显著提高了交易欺诈损失率的控制和信贷审批效率,推动企业在数字化转型中取得竞争优势。
272 16
PbootCMS增加可允许上传文件类型,例如webp、mov等文件格式扩展
PbootCMS增加可允许上传文件类型,例如webp、mov等文件格式扩展
2024云栖大会,我们来了!
2024云栖大会亮点介绍
374 1
|
11月前
【Python-Numpy】numpy.expand_dims()的解析与使用
np.expand_dims()函数的作用,它用于在指定位置插入新轴,扩展数组的维度。
173 2
Kubernetes(K8S) 常用命令
Kubernetes(K8S) 常用命令
134 0
一个SSL证书错误。CAFileNotFound
一个SSL证书错误。CAFileNotFound
202 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等