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

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

前言


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


思路


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


总结


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

       祝大家国庆快乐!

相关文章
|
7月前
|
Python
湖南大学第十六届程序设计竞赛(重现赛)补题题解(更新中)
湖南大学第十六届程序设计竞赛(重现赛)补题题解(更新中)
37 0
|
算法 数据库 C语言
|
机器学习/深度学习 人工智能 算法
下一篇
DataWorks