迷宫问题(递归调用)分析与实现(回溯算法Java)

  • 递归是一种算法结构
  • 回溯是一种算法思想
递归调用规则

图片来源百度

  1. 当程序执行到一个方法时,就会开辟一个独立的空间(栈)
  2. 每个空间的数据(局部变量)是独立的。
递归需要遵守的重要规则
  1. 执行一个方法时,就创建一-个新的受保护的独立空间(栈空间)。
  2. 方 法的局部变量是独立的,不会相互影响。
  3. 如果 方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据。
  4. 归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError。
  5. 当一个方法执行完毕,或者遇到return, 就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。
迷宫问题–递归
package Eccorsion;

/**  
 * @ClassName: MiGong
 * @Description: 迷宫数字化
 * 8行7列 
 * 1为墙壁 
 * 0为可行走位置
 * 2为走过的位置
 * 3为断路
 * 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
 * @author author
 * @date 2020-08-14 
*/  
public class MiGong {

	public static void main(String[] args) {
		// 創建迷宮8行7列
		int[][] Array = new int[8][7];
		int t = 0;
		// 設置上下邊界
		for (int i = 0; i < 7; i++) {
			Array[0][i] = 1;
			Array[7][i] = 1;
		}
		// 設置左右邊界
		for (int i = 0; i < 8; i++) {
			Array[i][0] = 1;
			Array[i][6] = 1;
		}
		Array[3][1] = 1;
		Array[3][2] = 1;
		// 打印地圖
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 7; j++) {
				System.out.print(Array[i][j] + " ");
			}
			System.out.println();
		}
		System.out.println("迷宫通路");
		setWay(Array, 1, 1);
		// 打印迷宫通路
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 7; j++) {
				System.out.print(Array[i][j] + " ");
				if (Array[i][j] == 2) {
					t++;
				}
			}
			System.out.println();
		}
		System.out.println("所需步数" + t);
	}

	/**
	 * 
	 * @Title: setWay
	 * @Description: 调用递归回溯来找出路
	 * @param Array 地图
	 * @param i     行
	 * @param j     列 迷宫行走策略:下->右->上->左
	 * @return boolean
	 */
	public static boolean setWay(int Array[][], int i, int j) {

		if (Array[6][5] == 2) {
			// 通路结束
			return true;
		} else {
			if (Array[i][j] == 0) {
				// 假设能走通
				Array[i][j] = 2;

				// 递归回溯 向下走
				if (setWay(Array, i + 1, j)) {
					return true;
				}
				// 不能向下便向右
				else if (setWay(Array, i, j + 1)) {
					return true;
				}
				// 不能向右便向上
				else if (setWay(Array, i - 1, j)) {
					return true;
				}
				// 不能向上便向左
				else if (setWay(Array, i, j - 1)) {
					return true;
				} else {
					// 不能走通
					Array[i][j] = 3;
					return false;
				}
			} else {
				// Array[i][j]!=0 可以是1(边界)2(通路)3(死路)
				return false;
			}
		}
	}
}

对迷宫问题的讨论与总结

1.迷宫通路的选择与程序设置的找路策略有关,即路的上下左右顺序有关

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值