日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 数据结构 迷宫_JAVA数据结构与算法之递归(一)~ 迷宫问题

發布時間:2024/8/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 数据结构 迷宫_JAVA数据结构与算法之递归(一)~ 迷宫问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

遞歸

遞歸需要遵守的重要規則

1) 執行一個方法時,就創建一個新的受保護的獨立空間(棧空間)

2) 方法的局部變量是獨立的,不會相互影響, 比如 n 變量

3) 如果方法中使用的是引用類型變量(比如數組),就會共享該引用類型的數據.

4) 遞歸 必須向退出遞歸的條件逼近,否則就是無限遞歸,出現 StackOverflowError,死龜了:)

5) 當一個方法執行完畢,或者遇到 return,就會返回, 遵守誰調用,就將結果返回給誰,同時當方法執行完畢或者返回時,該方法也就執行完畢

迷宮問題:

迷宮問題示意圖

使用遞歸回溯來給小球找路

說明

1. map 表示地圖

2. i,j 表示從地圖的哪個位置開始出發 (1,1)

3. 如果小球能到 map[6][5] 位置,則說明通路找到.

4. 約定: 當 map[i][j] 為 0 表示該點沒有走過 當為 1 表示墻 ; 2 表示通路可以走 ; 3 表示該點已經走過,但是走不通

5. 在走迷宮時,需要確定一個策略(方法) 下->右->上->左 , 如果該點走不通,再回溯

6.地圖標記圖

-------------------------------------------------------

地圖的情況

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

代碼實現:

package com.pierce.algorithm;

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) {

// 通路已經找到 ok

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) { // 通路已經找到 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;

}

}

}

}

運行結果:

小球走過,并標識過的 地圖的情況

1 1 1 1 1 1 1

1 2 0 0 0 0 1

1 2 2 2 0 0 1

1 1 1 2 0 0 1

1 0 0 2 0 0 1

1 0 0 2 0 0 1

1 0 0 2 2 2 1

1 1 1 1 1 1 1

總結

以上是生活随笔為你收集整理的java 数据结构 迷宫_JAVA数据结构与算法之递归(一)~ 迷宫问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。