遞迴演算法-迷宮回溯問題
阿新 • • 發佈:2021-07-07
一、遞迴介紹
二、遞迴案例(迷宮回溯問題)
程式碼實現(Java):
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; } //設定擋板, 1 表示 map[3][1] = 1; map[3][2] = 1; map[1][2] = 1; map[2][2] = 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(); } //使用遞歸回溯給小球找路 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.print(map[i][j] + " "); } System.out.println(); } } //使用遞歸回溯來給小球找路 //說明 //1. map 表示地圖 //2. i,j 表示從地圖的哪個位置開始出發 (1,1) //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) { // 通路已經找到ok 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) { // 通路已經找到ok 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; } } } }