PHP實現基於回溯法求解迷宮問題的方法詳解

2022-10-06 08:18:11 字數 1716 閱讀 8161

引言

最近在leetcode上看了些演算法題,有些看著很簡單的很常用的東西,竟然一下子想不出來怎麼求解,比如說:實現sqrt函式,求陣列的排列。如果高數學的不好,這些看似簡單的問題,第一次碰到也會感覺很難求解,當然了,今天要說的是這樣乙個問題,求解迷宮的所有解,這個問題的求解用到了回溯法的思想,不了解這個思想的話,很多稍微複雜點的問題都很難解了。

問題描述

這個問題是在實在瞎逛的時候碰到的,具體**記不太清了。

1   1   1   1

0   1   0   1

0   1   0   1

0   1   1   1

上面是乙個迷宮,左上角是入口,右下角是出口,小萌(對,你沒看錯,是長了草的小明)從入口進入,從出口逃出(1個小時逃不出會被x怪物吃掉),其中1表示可以通行,0表示不能通行,只能向右和向下兩個方向走,求出所有的小萌可能逃生的路線。

這個問題看似挺簡單,一下就可以看到答案,但是將思想翻譯為**卻不知道從何入手了。

如何解決

解決這個問題的一種方案就是回溯法,先一起看看回溯法(百度百科)的定義:

回溯法(探索與回溯法)是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」程式設計客棧。

我的思路:

1. 對上面的迷宮進行座標化,左上角是(0,0),右下角是(3,3),其他點分散在座標系中

2. 從(0,0)開始

3. 從給定的座標點nvlodshdos開始,先向右搜尋,是1的話繼續,是0的話向下搜尋,搜尋前記錄當前已經搜尋過的座標

4. 當座標等於(3,3)的時候就是乙個回溯點了,這個時候也返回

5. 只要不越界,重複第三步驟

看看我的php實現:

<?php $nums = [

[1,1,1,1,1,1]www.cppcns.com,

[0,1,0,1,0,1],

[0,1,0,1,0,1],

[0,1,1,1,1,1]

];function getret($data, $x, $y, &$result=, $record)

if($data[$x][$y] == "0") elseif($data[$x][$y] == "1")

} else

//向有搜尋

//這裡的$snapshort儲存當前搜尋位置的狀態,等到下次回溯到這裡的時候會用到

getret($data, $x, ++$y, $snapshort);

//向下搜尋

getret($data, ++$x, --$y, $result, $snapshort);

}//看個例子

$result = ;

getret($nums, 0, 0, $result, );

foreach ($result as $pos) ,) => ";

} echo "end\n";

}輸出結果

(0,0)=>(0,1)=>(0,2)=>(0,3)=>(0,4)=>(0,5)=>(1,5)=>(2,5)=>(3,5)=>end

(0,0)=>(0,1)=>(0,2)=>(0,3)=>(1,3)=>(2,3)=>(3,3)=>(3,4)=>(3,5)=>end

(0,0)=>(0,1)=>(1,1)=>(2,1)=>(3,1)=>(3,2)=&>(3,4)=>(3,5)=>end

回溯法求解迷宮問題

題目 這是我在老師發的ppt上發現的一道題,如下 1表示起點 7表示終點,一共六個路口,每個路口可以通達最多左上右三個路口,不能走的方向用0表示,求從1到7的路徑。求解思路 每個路口最多有三個搜尋分支。把演算法設計為如下的搜尋過程 把整個搜尋分解為向左 向前和向右三個方向上子問題的搜尋。當搜尋到某個...

回溯法求解迷宮問題

最近在leetcode上看了些演算法題,有些看著很簡單的很常用的東西,竟然一下子想不出來怎麼求解,比如說 實現sqrt函式,求陣列的排列。如果高數學的不好,這些看似簡單的問題,第一次碰到也會感覺很難求解,當然了,今天要說的是這樣乙個問題,求解迷宮的所有解,這個問題的求解用到了回溯法的思想,不了解這個...

python 用回溯法求解迷宮問題

今天刷華為機試題,刷到一道迷宮問題,看了其他人提交的 發現有許多小bug不是很滿意,我這裡就用回溯法解決了這個迷宮問題,配上 講解 題目 定義乙個二維陣列n m 其中2 n 10 2 m 10 如5 5陣列下所示 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著...