迷宫回溯问题
1、如果小球能到arr[6][5],说明通路找到
2、约定:
当arr[i][j]为0表示该点没有走过,为1表示墙,为2表示通路可以走,为3表示走过但是没有走通
3、走迷宫时定义一个策略,"下->右->上->左",如果该点走不通,再回溯
1、定义迷宫的大小以及墙壁
// 初始化迷宫大小 int[][] arr = new int[8][7]; // 给迷宫画墙 for (int i = 0; i < 8; i++) { arr[i][0] = 1; arr[i][6] = 1; } for (int i = 0; i < 7; i++) { arr[0][i] = 1; arr[7][i] = 1; } arr[3][1] = 1; arr[3][2] = 1;
2、 编写递归算法,给小球找路
/** * 递归给小球找路 * * @param arr 迷宫地图 * @param i 小球坐标 * @param j 小球坐标 * @return */ public static boolean setWay(int[][] arr, int i, int j) { // 找到了通路 if (arr[6][5] == 2) { return true; } else { // 该点没有走过,按照下右上左的方式走 if (arr[i][j] == 0) {//表示没有过 /*假设该点是可以走的:按照策略"下->右->上->左"走*/ arr[i][j] = 2; if (setWay(arr, i + 1, j)) { // 向下递归 return true; } else if (setWay(arr, i, j + 1)) { // 向下递归 return true; } else if (setWay(arr, i - 1, j)) {// 向上递归 return true; } else if (setWay(arr, i, j - 1)) {// 向左递归 return true; } else { // 都走不通 arr[i][j] = 3; return false; } } else { // arr[i][j]!=0一定是1,3,两种情况,返回false return false; } } }
3、完整代码:
package Demo; /** * @author zhangzhixi */ public class Test04_迷宫回溯问题 { public static void main(String[] args) { // 初始化迷宫大小 int[][] arr = new int[8][7]; // 给迷宫画墙 for (int i = 0; i < 8; i++) { arr[i][0] = 1; arr[i][6] = 1; } for (int i = 0; i < 7; i++) { arr[0][i] = 1; arr[7][i] = 1; } arr[3][1] = 1; arr[3][2] = 1; /*原始迷宫*/ System.out.println("===========================原始迷宫======================="); for (int[] ints : arr) { for (int anInt : ints) { System.out.print(anInt + "\t"); } System.out.println(); } System.out.println("===========================原始迷宫======================="); setWay(arr, 1, 1); /*走完后的迷宫*/ System.out.println("===========================走完后的迷宫======================="); for (int[] ints : arr) { for (int anInt : ints) { System.out.print(anInt + "\t"); } System.out.println(); } System.out.println("===========================走完后的迷宫======================="); } /** * 递归给小球找路 * * @param arr 迷宫地图 * @param i 小球坐标 * @param j 小球坐标 * @return */ public static boolean setWay(int[][] arr, int i, int j) { // 找到了通路 if (arr[6][5] == 2) { return true; } else { // 该点没有走过,按照下右上左的方式走 if (arr[i][j] == 0) {//表示没有过 /*假设该点是可以走的:按照策略"下->右->上->左"走*/ arr[i][j] = 2; if (setWay(arr, i + 1, j)) { // 向下递归 return true; } else if (setWay(arr, i, j + 1)) { // 向下递归 return true; } else if (setWay(arr, i - 1, j)) {// 向上递归 return true; } else if (setWay(arr, i, j - 1)) {// 向左递归 return true; } else { // 都走不通 arr[i][j] = 3; return false; } } else { // arr[i][j]!=0一定是1,3,两种情况,返回false return false; } } } }