Live2D
Fork me on GitHub

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  

 

posted @ 2020-06-18 12:20  -小二黑-  阅读(216)  评论(0编辑  收藏  举报