迷宫问题

说明:

  (1)小球得到的路径,和程序员设置的找路策略有关系:找路的上下左右的顺序有关

  (2)再得到小球路径时,可以先试用(下右上左),可以先使用(下右上左),再改成(上右下左),看看路径是否有变化

  (3)测试回溯现象

  (4)思考:如何求出最短路径?

          

 

代码分析:

  1 package com.java.recursion;
  2 
  3 public class MiGong {
  4 
  5     public static void main(String[] args) {
  6         
  7         // 先创建一个二维数组,模拟迷宫
  8         // 地图
  9         int[][] map = new int[8][7];
 10         
 11         // 用1表示墙
 12         // 上下全部置为1
 13         for(int i = 0;i < 7;i++) {
 14             map[0][i] = 1;
 15             map[7][i] = 1;
 16         }
 17         //左右全部置为1
 18         for(int i = 0;i < 8;i++) {
 19             map[i][0] = 1;
 20             map[i][6] = 1;
 21         }
 22         //设置挡板
 23         map[3][1] = 1;
 24         map[3][2] = 1;
 25         
 26         //输出地图
 27         System.out.println("地图情况");
 28         for(int i = 0;i<8;i++) {
 29             for(int j =0;j<7;j++) {
 30                 System.out.print(map[i][j]+" ");
 31             }
 32             System.out.println();
 33         }
 34         
 35 //        //使用 递归回溯给小球找路
 36 //        boolean flag = setWay(map, 1, 1);
 37 //        
 38 //        //输出地图
 39 //        System.out.println("小球走过的路,标识的地图");
 40 //        for(int i = 0;i<8;i++) {
 41 //            for(int j =0;j<7;j++) {
 42 //                System.out.print(map[i][j]+" ");
 43 //            }
 44 //            System.out.println();
 45 //        }
 46         
 47         boolean flag2 = setWay2(map, 1, 1);
 48         //输出地图
 49         System.out.println("小球走过的路,标识的地图");
 50         for(int i = 0;i<8;i++) {
 51             for(int j =0;j<7;j++) {
 52                 System.out.print(map[i][j]+" ");
 53             }
 54             System.out.println();
 55         }
 56 
 57     }
 58     
 59     
 60     // 使用递归回溯来给小球找路
 61     // 说明
 62     // 1. map 表示地图
 63     // 2. i,j 表示从地图的那个位置开始出发
 64     // 3. 如果小球到 map[6][5] 位置,则说明通路找到
 65     // 4. 约定:当map[i][j] 为0表示该点没有走过;当为1表示墙;2表示通路,可以走;
 66     //        3表示该位置以及走过,但是走不通
 67     // 5.在走迷宫时,需要确定一个策略(方法),下—>右—>上—>左,如果该点走不通,再回溯
 68     /**
 69      * 
 70      * @param map 表示地图
 71      * @param i   从那个位置开始找
 72      * @param j   
 73      * @return    找到通路就返回true,否则返回false
 74      */
 75     public static boolean setWay(int[][] map,int i,int j) {
 76         if(map[6][5] == 2) {  // 通路已经找到OK
 77             return true;
 78         } else {
 79             if(map[i][j] == 0) { // 如果当前这个点没有走过
 80                 // 按照策略走 下->右->上->左
 81                 map[i][j] = 2;   // 假定该点是可以走通的。
 82                 if(setWay(map,i+1,j)) {  //向下走
 83                     return true;
 84                 } else if(setWay(map,i,j+1)) {  //向右走
 85                     return true;
 86                 } else if(setWay(map,i-1,j)) {  //向上走
 87                     return true;
 88                 } else if(setWay(map,i,j-1)) {  // 向左走
 89                     return true;
 90                 } else {
 91                     // 说明该点是走不通的,是死路
 92                     map[i][j] = 3;
 93                     return false;
 94                 }
 95             } else {   // 如果map[i][j] !=0,可能是1,2,3
 96                 return false;
 97             }
 98         }
 99     }
100     
101     // 第二种策略
102     public static boolean setWay2(int[][] map,int i,int j) {
103         if(map[6][5] == 2) {  // 通路已经找到OK
104             return true;
105         } else {
106             if(map[i][j] == 0) { // 如果当前这个点没有走过
107                 // 按照策略走 上->右->下->左
108                 map[i][j] = 2;   // 假定该点是可以走通的。
109                 if(setWay2(map,i-1,j)) {       //向上走
110                     return true;
111                 } else if(setWay2(map,i,j+1)) {  //向右走
112                     return true;
113                 } else if(setWay2(map,i+1,j)) {  //向下走
114                     return true;
115                 } else if(setWay2(map,i,j-1)) {  // 向左走
116                     return true;
117                 } else {
118                     // 说明该点是走不通的,是死路
119                     map[i][j] = 3;
120                     return false;
121                 }
122             } else {   // 如果map[i][j] !=0,可能是1,2,3
123                 return false;
124             }
125         }
126     }
127 
128 }

 

 

 

 

 

posted on 2019-11-03 16:27  格物致知_Tony  阅读(638)  评论(1编辑  收藏  举报