java 数据结构 迷宫_JAVA数据结构与算法之递归(一)~ 迷宫问题

递归

递归需要遵守的重要规则

1) 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)

2) 方法的局部变量是独立的,不会相互影响, 比如 n 变量

3) 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.

4) 递归 必须向退出递归的条件逼近,否则就是无限递归,出现 StackOverflowError,死龟了:)

5) 当一个方法执行完毕,或者遇到 return,就会返回, 遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕

迷宫问题:

迷宫问题示意图

9a7cb8527db9d290ae9530948eaffc70.png

使用递归回溯来给小球找路

说明

1. map 表示地图

2. i,j 表示从地图的哪个位置开始出发 (1,1)

3. 如果小球能到 map[6][5] 位置,则说明通路找到.

4. 约定: 当 map[i][j] 为 0 表示该点没有走过 当为 1 表示墙 ; 2 表示通路可以走 ; 3 表示该点已经走过,但是走不通

5. 在走迷宫时,需要确定一个策略(方法) 下->右->上->左 , 如果该点走不通,再回溯

6.地图标记图

-------------------------------------------------------

地图的情况

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

代码实现:

package com.pierce.algorithm;

public class MiGong {

public static void main(String[] args) {

// 先创建一个二维数组,模拟迷宫

// 地图

int[][] map = new int[8][7];

// 使用 1 表示墙

// 上下全部置为 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;

}

//设置挡板, 1 表示

map[3][1] = 1;

map[3][2] = 1;

// map[1][2] = 1;

// map[2][2] = 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();

}

//使用递归回溯给小球找路

setWay(map, 1, 1);

// setWay2(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();

}

}

//使用递归回溯来给小球找路

//说明

//1. map 表示地图

//2. i,j 表示从地图的哪个位置开始出发 (1,1)

//3. 如果小球能到 map[6][5] 位置,则说明通路找到.

//4. 约定: 当 map[i][j] 为 0 表示该点没有走过 当为 1 表示墙 ; 2 表示通路可以走 ; 3 表示该点已经走过,但是走不通

//5. 在走迷宫时,需要确定一个策略(方法) 下->右->上->左 , 如果该点走不通,再回溯

/**

* @param map 表示地图

* @param i 从哪个位置开始找

* @param j

* @return 如果找到通路,就返回 true, 否则返回 false

*/

public static boolean setWay(int[][] map, int i, int j) {

// 通路已经找到 ok

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 { // 如果 map[i][j] != 0 , 可能是 1, 2, 3

return false;

}

}

}

//修改找路的策略,改成 上->右->下->左

public static boolean setWay2(int[][] map, int i, int j) {

if (map[6][5] == 2) { // 通路已经找到 ok

return true;

} else {

if (map[i][j] == 0) { //如果当前这个点还没有走过

//按照策略 上->右->下->左

map[i][j] = 2; // 假定该点是可以走通.

if (setWay2(map, i - 1, j)) {//向上走

return true;

} else if (setWay2(map, i, j + 1)) { //向右走

return true;

} else if (setWay2(map, i + 1, j)) { //向下

return true;

} else if (setWay2(map, i, j - 1)) { // 向左走

return true;

} else {

//说明该点是走不通,是死路

map[i][j] = 3;

return false;

}

} else { // 如果 map[i][j] != 0 , 可能是 1, 2, 3

return false;

}

}

}

}

运行结果:

小球走过,并标识过的 地图的情况

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值