递归调用相关案例

案例1:老鼠出迷宫问题

 1 public class MiGong{
 2     public static void main (String[] args){
 3         int [][] map= new  int [8][7];
 4         for (int i=0; i<7;i++ ) {
 5            map[0][i] = 1;
 6            map[7][i] = 1;
 7         }
 8         for (int i=0;i<7 ;i++ ) {
 9              map[i][0] = 1;
10              map[i][6] = 1;
11         }
12         for (int i=0 ;i<map.length ;i++ ) {
13             for (int j= 0;j<map[i].length ;j++ ) {
14                 System.out.print(map[i][j]+" ");
15             }
16             map[3][1]=1;
17             map[3][2]=1;
18             System.out.println();
19         }
20         //创建一个find类的对象,是can去调用findway方法调用
21         Find  can = new Find();
22             can.findway(map,1,1);
23           //  System.out.println(map[i][j]+" ");
24 
25             System.out.println("\n通过迷宫路线情况如下:");
26           for(int i=0;i<map.length;i++){
27               for (int j= 0;j<map[i].length ;j++ ) {
28                   System.out.print(map[i][j]+" ");
29               }
30               System.out.println();
31           }
32           
33 }
34     }
35       
36 /*
37   案列:小老鼠出迷宫
38   思路分析:
39   1.先确定迷宫的大小
40 */
41 
42 
43 
44   class Find{
45    /*
46     使用递归回溯的思想来解决老鼠出迷宫
47     1.findway方法就是专门啦找出迷宫的路程
48     2.如果找到,就返回true,否则返回false;
49     3.map二维数组,即表示迷宫
50     4.i,j就是老鼠的位置,初始化位置为(i,j);
51     5.因为我们是递归的找路,所以需要规定map数组的各个值的含义;
52     0表示可以走,1表示障碍物, 2表示可以走,3表示走过,但是走不通是死路
53     6.当map[6][5]=2就说明找到通路,就可以结束,否则就继续找
54     7.先确定老鼠找路策略:下》右》上》左
55    */
56      public boolean findway(int[][] map,int i ,int j){
57            if (map[6][5]==2) {//说明已经找到
58                   return true;
59            }else {
60                   if (map[i][j]==0) {//当前位置0,说明表可以走
61                       //我们假定2可以走通
62                    map[i][j] = 2;
63                    //使用找路策略,来确定该位置是否真的可以走通
64                     if (findway(map,i+1,j)) {//先走下
65                         return true;
66                     }else if (findway(map,i,j+1)) {//走右
67                         return true;
68                     }else if (findway(map,i-1,j)) {//走上
69                         return true;
70                     }else if (findway(map,i,j-1)) {//走左
71                         return true;
72                     }else {
73                         map[i][j]=3;
74                         return false;
75                     }
76                   }else {
77                       return false;
78                   }
79            }
80 
81 
82 
83      }
84             
85                     
86  }

 案例2:汉诺塔:

 1 public class tower{
 2     public static void main (String[] args){
 3 
 4               Ta  can = new Ta();
 5               can.move(4,'A','B','C');
 6     }
 7 }
 8 
 9 class Ta{
10     //num表示移动的个数,a,b,c分别表示A塔,B塔,C塔
11     public void move(int num ,char a,char b, char c){
12      //如只有一个盘 num=1;
13         if (num==1) {
14             System.out.println(a+"->"+c);
15         }else {
16             /*
17             如果有多个盘,可以看成两个,最下面的和最上面的所有盘
18             */
19             //1.先移动上面所有的盘到B,借助c
20             move(num-1,a,c,b);
21             //2.把最下面的这个盘,移动到c
22             System.out.println(a+"->"+c);
23             //3.再把b塔的所有盘,移动到c,借助a
24             move(num-1,b,a,c);
25         }
26     }
27 } 

 

posted @ 2022-02-26 17:01  捞月亮的渔夫  阅读(85)  评论(0)    收藏  举报