迷宫问题
说明:
(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 }