算法与数据结构学习(17)-递归(2)迷宫问题

迷宫问题

在这里插入图片描述
1.小球得到的路径,和程序员 设置的找路策略有关即:找 路的上下左右的顺序相关
2.再得到小球路径时,可以先 使用(下右上左),再改成(上 右下左),看看路径是不是有变化
3.测试回溯现象

代码实现

说明:
1.map表示地图
2.i j 表示从地图的那个位置出发
3.如果小球能到map[6][5]则通路找到
4.当map[i][j]为0时表示没有走过,1表示墙,2表示可以走,3表示该位置已经走过但是走不通
5.在走迷宫时需要确定一个策略(方法) 下-右-上-左,如果该点走不通再回溯

package recursion;

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;
		}
		//设置挡板
		map[3][1] =1;
		map[3][2] =1;
		//map[5][3] =1;
		//map[2][2] =1;
		
		//输出地图
		System.out.printf("地图情况:\n");
		for(int i =0;i<8;i++) {
			for(int j =0;j<7;j++) {
				System.out.printf(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.printf(map[i][j]+ " ");
			}
			System.out.println();
		}
	}
	
	//使用递归回溯给小球找路
	//说明:
	//1.map表示地图
	//2.i j 表示从地图的那个位置出发
	//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) {
		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) {//通路已经找到
			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;
			}
		}
	}


}


在这里插入图片描述

发布了90 篇原创文章 · 获赞 51 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/mzc_love/article/details/104479948