数据结构(Java)—— 递归应用(一)--迷宫问题

19 篇文章 0 订阅

递归应用(一)–迷宫问题

使用场景

image-20211009162722639

分析思路

1、使用二维数组来代替迷宫,做个事前声明

map表示地图,其中数据有:为0表示该点没有走过;为1表示墙;2表示通路可以走;3表示该点已经走过,但是走不通。

2、循环遍历数组设置出墙来

2、指定个寻路方式如(上右下左、左右上下等)

4、进行寻路方法的递归,判断相应点的情况

代码实现步骤

//设置地图
		int[][] map = new int[8][7];
		for(int i = 0; i<8; i++) {
			map[i][0]=1;
			map[i][6]=1;
		}
		map[3][1] = 1;
		map[3][2] = 1;
public static boolean find(int[][] map, int i, int j) {
		if(map[6][5] == 2) {
			return true;
		
		}else {
			if(map[i][j] == 0) { //如果当前这个点还没有走过
				//按照策略下->右->.上->左走
				map[i][j] = 2; //假定该点是可以走通。
				if(find(map, i+1, j)) {//向下走
					return true;
				} else if (find(map, i, j+1)) { //向右走
					return true;
				} else if (find(map, i-1, j)) { //向上
					return true;
				}else if(find(map, i, j-1)) { //向左
					return true;
				}else {
					//说明该店是个死路
					map[i][j] = 3;
					return false;
				}

			}else {
				return false;
			}
		}
	}

完整代码

package recursion;

public class Migong {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		//设置地图
		int[][] map = new int[8][7];
		for(int i = 0; i<8; i++) {
			map[i][0]=1;
			map[i][6]=1;
		}
		map[3][1] = 1;
		map[3][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();
		}
		
		
		//递归找路
		//使用递归回溯来给小球找路
		//说明
		//1. map表示地图
		//2. i,j 表示从地图的哪个位置开始出发(1,1)
		//3.如果小球能到map[6][5]位置,则说明通路找到.
		//4. 约定:当map[i][j] 为0表示该点没有走过当为1表示墙; 2表示通路可以走; 3表示该点已经走过,但是走不通
		//5.在走迷宫时,需要确定一个策略(方法)下->右->上->左 ,如果该点走不通,再回溯
		
		find(map,1,1);
		
		//输出新地图
		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 find(int[][] map, int i, int j) {
		if(map[6][5] == 2) {
			return true;
		
		}else {
			if(map[i][j] == 0) { //如果当前这个点还没有走过
				//按照策略下->右->.上->左走
				map[i][j] = 2; //假定该点是可以走通。
				if(find(map, i+1, j)) {//向下走
					return true;
				} else if (find(map, i, j+1)) { //向右走
					return true;
				} else if (find(map, i-1, j)) { //向上
					return true;
				}else if(find(map, i, j-1)) { //向左
					return true;
				}else {
					//说明该店是个死路
					map[i][j] = 3;
					return false;
				}

			}else {
				return false;
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

痞子三分冷ゾジ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值