目前剛剛學到這個題目,還沒有看演算法講解,先寫下自己第一時間的思考
這個問題如果我來做,
首先用二維矩陣來模擬乙個迷宮,0表示可以走,1表示不可以走,繪出迷宮輪廓
問題在於怎麼走出迷宮,
目前的思路是這樣的:
首先我會規定好它的遍歷策略,先往哪個方向看,再往哪個方向看,有路就走,走不通再說.
這樣肯定會導致一些問題,比如走的路是死胡同的情況,那怎麼處理?
或許可以說記錄一下走過的路,走的路是死路了,那我標記一下此路不通.但是在**標記,我又怎麼判斷我走的這條路不通的?
走不通的判斷方法:我走過的路做好,當我走了一遍又回到了以前的地方說明之前走的方向有問題.
做標記:在我重新回到這個位置的時候我會標記上這個位置的某個方向(我走過的有標記的方向的路)是走不通的.
這就去學習前人的先進的思想
看完前人的回溯演算法用於處理迷宮的理解
其實這個問題可以簡化成乙個重複性的問題,每一步都是乙個探路的過程
簡單理解為,乙個人探路,當此路不通的時候傳遞訊號告訴前面的自己,此路不通,並坐下標記,於是前面的自己就會選擇他路
前面的疑惑:
1. 在**標記?
當四面都走不了的時候就是走不通咯
具體方法:
牆為1,走過為2,死路為3
探路,有路就走,並標記為2
當發現此路不通(四周沒有0),立地為碑,標記為3,並告訴前面的自己,此路不通(找路 return false)
因此個人理解本例中的遞迴,其實是一種可以自我複製的方法(找路),並且可以把當前的結果(找沒找到路)反饋給上一級的一種手段
或者為了更清晰的理解,我認為他是乙個樹狀結構,這樣一下子就清晰了很多
操作**
package recursion;
public
class
migong
// 行牆
for(
int i =
0; i <
7; i++
)// 牆
map[3]
[1]=
1;map[3]
[2]=
1;setway
(map,1,
1);// 檢視
for(
int i =
0; i <
8; i++
) system.out.
println()
;}}/**
* * @param map 地圖
* @param i 位置點
* @param j
* @return 找到路沒有
*/public
static
boolean
setway
(int
map,
int i,
int j)
// 當前是個假路,直接報錯
if(map[i]
[j]!=0)
//能走的路
else
// 向右找
elseif(
setway
(map, i, j +1)
)// 向上找
elseif(
setway
(map, i -
1, j)
)// 向左找
elseif(
setway
(map, i, j -1)
)// 沒找到
else}}
}
迷宮回溯問題
概念介紹 請看圖,上圖為乙個迷宮,1為阻擋區間,也就是說不能走。0為可踏足地帶,我們的目標是從a點出發,走到b點,則任務完成!為了方便大家理解,我們只在 3,1 以及 3,2 這兩個位置設定阻擋位。實現 先明確實現思路 假設我們在a 1,1 位置,我們能做的操作是嘗試向下 向右 向上或者向左走一步。...
迷宮問題思考
還有,地牢的迷宮應該是不完美的。完美 的迷宮意味著兩點之間只有唯一的一條通路。所有的走廊分布得就像一棵樹,它有樹叉,但是中間沒有交集。而 不完美 的迷宮則有著可迴圈的通路 從 a 到 b 有多個可選通路。不完美 的迷宮是遊戲機制的需要,而不是技術上的需求。你可以造乙個基於 完美 的迷宮的 rogue...
回溯法 迷宮問題
1.首先我們需要自定義乙個迷宮 左上角為入口,右下角為出口,0為路,1為牆 用二維陣列儲存 2.我們在走迷宮之前,首先要確立乙個走的順序,即貪心準則,我們首先試探的方向應該是下,然後是右,上,左 為了確保每乙個格仔都有上下左右,我們需要給我們的迷宮加上一圈牆8 8,變成10 10 3.當我們在乙個格...