Java—递归(迷宫问题)适合小白

迷宫问题

一、问题描述:

有一个8 ×7的迷宫,如图所示,现在有一个小球需要从左上角运动到右下角,请找出一条路。

地图描述:红色区域为墙,小球不能通过,小球只能在白色区域移动

二、问题解决

在这个问题中,我们用递归来解决,起始位置为第一行第一列,小球每次移动可以向上、左、下、右 这四个方向移动,并且这四个方向等可能,我们可以制定小球移动策略,这里我规定小球 以 右-上-左-下 的策略移动,即小球先向有移动,当向右不能在移动之后,小球再向上移动,依此类推、、、
我们先将地图数字化,转化为一个8×7的数组:
1 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 0 1 0 0 1
1 1 1 0 0 0 1
1 0 0 0 0 0 1
1 0 1 0 1 1 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1

1:表示地图中的墙,0表示地图中小球可以走的白色区域

为了分清小球在地图中那些地方可以走,那些地方不可以走,那些地方走过,我们须得做一个约定,便于识别。值得注意的是,“走过” 又有两种情况,即、走到这个地方,还可以继续走(走得通);也有另一种情况,走到死胡同(走不通),所以我们在做约定的时候要分两种情况。

约定:

  1. 小球不能走的地方,即墙,我们在数组中用 ” 1 “ 来标识;
  2. 小球可以走的地方,即白色区域,我们在数组中用 ” 0 “ 来标识;
  3. 小球走的通的地方,我们在数组中用 ” 2 “ 来标识;
  4. 小球能走,但走不通的地方,我们在数组中用 ” 3 “ 来标识;

代码:

package recursion;

public class MiGong {

	public static void main(String[] args) {

//		要求:从第一行第一列出发到达右下角
//		1.创建地图
//		2.制定策略:右-上-左-下
//		3.地图说明:0表示可以走,1表示墙,2表示通路,3表示走过但不通

//		创建一个二维数组用于模拟地图
		int[][] Map = new int[8][7];
//		初始化地图
//		地图中的挡板
		Map[2][3] = 1;
		Map[3][1] = 1;
		Map[3][2] = 1;
		Map[5][2] = 1;
		Map[5][4] = 1;
		Map[5][5] = 1;
//		做地图中的上下墙
		for (int i = 0; i < 7; i++) {
			Map[0][i] = 1;
			Map[7][i] = 1;
		}
//		做地图中的左右墙
		for (int i = 0; i < 8; i++) {
			Map[i][0] = 1;
			Map[i][6] = 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();
		}
		Recursion(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 Recursion(int Map[][], int i, int j) {

		if (Map[6][5] == 2) {// 到达右下角即返回true 退出
			return true;
		} else if (Map[i][j] == 0) {

			Map[i][j] = 2;// 假定此时可以走通
			// 策略:右-上-左-下
			if (Recursion(Map, i, j + 1)) {// 向右走
				return true;
			} else if (Recursion(Map, i + 1, j)) {// 向上走
				return true;
			} else if (Recursion(Map, i, j - 1)) {// 向左走
				return true;
			} else if (Recursion(Map, i - 1, j)) {// 向下走
				return true;
			} else {
				Map[i][j] = 3;// 走不通,将其值设为3,表示走过但走不通
				return false;
			}
		} else {// Map[i][j]不为0,即为1:墙,2:走过的路能走通,3:走过的路不能走通
			return false;// 能走的都走完了 即 没有可走的了
		}

	}

}

代码执行结果

数字 2 所组成的路线即为小球的移动路线

当地图为图2所示时,运行结果为:(这里就不给代码了,只需将二维数组中的第一行第二列赋值为 1 就可以了)

在这里插入图片描述

在这里插入图片描述

小结:这里我们是通过递归来解决的迷宫问题,我们制定了右-上-左-下的小球移动策略,大家可以试一试改变策略之后,小球移动的轨迹又是怎么样的~~~~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南疆晚歌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值