10、递归的回溯现象与八皇后问题

public class Maze {

public static void main(String[] args) {

	//创建地图
	int map[][] = new int[8][7];
	for(int i = 0; i < 7; ++i) {
		map[0][i] = 1;
		map[7][i] = 1;
	}
	for(int j = 0; j < 8; ++j) {
		map[j][0] = 1;
		map[j][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();
	}


	T t1 = new T();
	boolean result = t1.findWay(map, 1, 1);
	if (result) {
		//输出当前地图
		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();
		}
	} else {
		System.out.println("未找到路!");
	}
}

}

class T {
//使用递归解决老鼠出迷宫
/*
思路
(1)参数为地点,以及迷宫地图
(2)返回值为Boolean类型
(3)退出递归的条件,需要定义map数组各个值的含义
* 0表示没有障碍物
* 1表示有障碍物
* 2表示认为是可以进入的路
* 3表示是路,但是走不通
地形为1,无需探路,若地形为2,3,为判断结果,已经走过,不往回走
0走进去就是2,2的四个方向都走不通就成了3
因为是探路,在遇到目标前是个连续不断的过程,所以遇0则变2,四个方向走不通再变3
因此
* 需要有个判断作为探路结束的标准
* 方法作为判断条件,需要对上一层返回true和false,以确定上一层的语句执行

	(4)则当map[6][5] == 2时,表示结束寻路
	(5)确定老鼠寻路的策略:下——>右——>上——>左
*/
public boolean findWay(int map[][], int i, int j) {

	if(map[6][5] == 2) {
		return true;
	} else {
		if(map[i][j] == 0) {
			//该地形为0,无障碍物,则进入,此时该地形便变为了2,即是可以进入的路
			map[i][j] = 2;
			//进入该地形后,尝试进入他相邻的四个地形
			if (findWay(map, i+1, j)) {//向下走,地形为0,进入变2
				return true;//必须返回true,如果不返回true,则会在执行完本层后,无法执行上一层if判断
				/*
					如果此时if语句内得到map[6][5]为true,则会执行此语句
					若返回true,意味着下方道路可以走,则会回到上一层if判断,层层返回true,使最终结果为true
					若返回false,则会依次执行上一层的条件判断
				*/
			} else if(findWay(map, i, j+1)) {
				return true;
			} else if(findWay(map, i-1, j)) {
				return true;
			} else if(findWay(map, i, j-1)) {
				return true;
			} else {
				map[i][j] = 3;
				return false;
			}

		} else {//此时,该地形为1,无需探路,若地形为2,3,则是只有判断后才可能存在结果,不可能为2,3
			return false;
		}
	}
}

}

posted @ 2021-12-07 22:13  DarkSki  阅读(41)  评论(0编辑  收藏  举报