- 递归回溯-迷宫问题(Java)
- 1.概念
- 2.运行机制
- 3.递归调用规则
- 4.应用场景
- 5.递归必须遵守的规则
- 迷宫问题
2.运行机制 3.递归调用规则递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。
4.应用场景1)当程序执行到一个方法时,就会开辟一个独立的空间(栈)
2)每个空间的数据(局部变量),是独立的(四个栈虽然都是n,但是值是不同的)
5.递归必须遵守的规则1)各种数学问题如: 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google编程大赛)
2)各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.
3)将用栈解决的问题–>递归代码比较简洁
迷宫问题1)执行一个方法时,就创建一个新的受保护的独立空间(栈空间) — 默认遵守了(main)
2)方法的局部变量是独立的,不会相互影响, 比如n变量
3)如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.(上图堆中的)
4)递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError,栈溢出)
5)当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。
利用递归回溯算法找到出口
package DataStructures.Backtracking;
public class Maze {
public static void main(String[] args) {
//创建一个二维数组,模拟迷宫地图
int[][] map = new int[8][7];
//1表示墙
for (int i = 0; i < 7; i++) {
map[0][i] = 1;
map[7][i] = 1;
}
//左右为1
for (int i = 0; i < 8; i++) {
map[i][0] = 1;
map[i][6] = 1;
}
map[3][1] = 1;
map[3][2] = 1;
map[1][2] = 1;
map[2][2] = 1;
for (int i = 0; i < 8; ++i) {
for (int j = 0; j < 7; ++j) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
setWay(map, 1, 1);
System.out.println();
for (int i = 0; i < 8; ++i) {
for (int j = 0; j < 7; ++j) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
public static boolean setWay(int[][] map, int i, int j) {
if (map[6][5] == 2) {//到达出口
return true;
} else {
if (map[i][j] == 0) {//还没走
map[i][j] = 2;//假设走通了
if (setWay(map, i + 1, j)) {//向下
return true;
} else if (setWay(map, i, j + 1)) {//向右
return true;
} else if (setWay(map, i - 1, j)) {//向上
return true;
} else if (setWay(map, i, j - 1)) {//向左
return true;
} else {//都走不通
map[i][j] = 3;
return false;
}
} else {
return false;
}
}
}
}



