zoukankan      html  css  js  c++  java
  • 11、递归-迷宫问题

    来源:https://www.bilibili.com/video/BV1B4411H76f?p=39

    一、规则

    1、递归过程中,每当执行一个方法时,会创建一个新的受保护的独立空间(栈空间)

    2、方法中的变量,即每个空间的数据是独立的,不会相互影响

    3、如果方法中使用了引用变量(比如数组),那么这种数据就会被共享

    4、整个循环必须向退出递归的条件逼近,否则就会无限循环下去

    5、方法执行完毕(或者有return)就会返回,谁调用了这个方法,结果就会给谁。

    二、迷宫问题

    寻找一条由黑色小球到白色小球的路径,中间阴影部分是墙,没法通过。

    三、实现

    创建一个二维数组代表整个地图,按照上图,数组的维度应该是[8,7]。在这里用1表示这个位置是墙,用2表示这个位置可以走,用3表示这个位置已经走过了但是个死路。

    接下来需要制定一个策略,我们可以按照先向下走,不通再右,再上,再左的策略尝试一下。

    1、创建地图

     1     public static void main(String[] args) {
     2         //创建地图
     3         int[][] map = new int[8][7];
     4 
     5         for (int i = 0; i < 8; i++) {
     6             map[i][0] = 1;
     7             map[i][6] = 1;
     8         }
     9         for (int i = 0; i < 7; i++) {
    10             map[0][i] = 1;
    11             map[7][i] = 1;
    12         }
    13         map[3][1] = 1;
    14         map[3][2] = 1;
    15 
    16         //打印地图
    17         for (int i = 0; i < 8; i++) {
    18             for (int j = 0; j < 7; j++) {
    19                 System.out.print(map[i][j]+"  ");
    20             }
    21             System.out.println();
    22         }
    23     }

    结果

    1  1  1  1  1  1  1  
    1  0  0  0  0  0  1  
    1  0  0  0  0  0  1  
    1  1  1  0  0  0  1  
    1  0  0  0  0  0  1  
    1  0  0  0  0  0  1  
    1  0  0  0  0  0  1  
    1  1  1  1  1  1  1  

    2、递归走迷宫

     1     /**
     2      * 地图中,1:墙 2:可以走 3:是个死路 0:没有走过
     3      * @param map 地图
     4      * @param i 初始位置的行坐标
     5      * @param j 初始位置的列坐标
     6      * @return
     7      */
     8     public static boolean setWay(int[][] map,int i,int j){
     9         if(map[6][5] == 2){
    10             //已经到达目的地了
    11             return true;
    12         }else {
    13             if(map[i][j] == 0){
    14                //如果当前的位置为0,没有走过,可以走
    15                 map[i][j] = 2;
    16                 //尝试向下走一步,找到通路了,返回true
    17                 if(setWay(map,i+1,j)){
    18                     return true;
    19                 }else if(setWay(map,i,j+1)){
    20                     //上一步没有找到通路,向右走一步试一下
    21                     return true;
    22                 }else if(setWay(map,i-1,j)){
    23                     //上一步没有找到通路,向上走一步试一下
    24                     return true;
    25                 }else if(setWay(map,i,j-1)){
    26                     //上一步没有找到通路,向左走一步试一下
    27                     return true;
    28                 }else {
    29                     //这个路是个死路
    30                     map[i][j] = 3;
    31                     return false;
    32                 }
    33             }else {
    34                 //要么走不通(3),要么是墙(1),要么本次已经过了(2)
    35                 return false;
    36             }
    37         }
    38     }

    结果

    1  1  1  1  1  1  1  
    1  2  0  0  0  0  1  
    1  2  2  2  0  0  1  
    1  1  1  2  0  0  1  
    1  0  0  2  0  0  1  
    1  0  0  2  0  0  1  
    1  0  0  2  2  2  1  
    1  1  1  1  1  1  1  
  • 相关阅读:
    再不努力提高效率,小姐姐都被人追走了:K8S一键部署了解一下?
    Spring Cloud和netflix 提供的Eureka等组件之间的版本关系
    启动kafka保错:命令过长语法不正确
    SpringBoot2.0 Config客户端自动刷新时没有/bus/refresh端点
    springcloud config配置采坑 Could not resolve placeholder 'from' in value "${from}报错,巨坑!
    Windows 下安装RabbitMQ服务器及基本配置
    linux 查看日志
    spring 事务原理
    IDEA 配置
    python中给定两个列表,怎么找出他们相同的元素和不同的元素?
  • 原文地址:https://www.cnblogs.com/zhao-xin/p/13156914.html
Copyright © 2011-2022 走看看