回溯法求解迷宮有關問題

來源:互聯網
上載者:User
回溯法求解迷宮問題

引言

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

問題描述

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

1   1   1   10   1   0   10   1   0   10   1   1   1

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

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

如何解決

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

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

我的思路:

  • 對上面的迷宮進行座標化,左上方是(0,0),右下角是(3,3),其他點分散在座標系中
  • 從(0,0)開始
  • 從給定的座標點開始,先向右搜尋,是1的話繼續,是0的話向下搜尋,搜尋前記錄當前已經搜尋過的座標
  • 當座標等於(3,3)的時候就是一個回溯點了,這個時候也返回
  • 只要不越界,重複第三步驟

看看我的PHP實現:

 $xL || $y > $yL) {        //跑到迷宮不存在的空間了,這種事情絕對不能發生        return;    }    if($data[$x][$y] == "0") {        //是0的話停止繼續前進,退回上一狀態        return;    } elseif($data[$x][$y] == "1") {        //是1的話,記錄最新的座標到當前已找到的路徑中,繼續向前搜尋        //如果到達出口,記錄答案並回溯        $snapshort = array_merge($record, [[$x, $y]]);        if($x == $xL && $y == $yL) {            $result[] = array_merge($record, [[$x, $y]]);            return;        }    } else {        return;    }           //向有搜尋    //這裡的$snapshort儲存當前搜尋位置的狀態,等到下次回溯到這裡的時候會用到    getRet($data, $x, ++$y, $result, $snapshort);    //向下搜尋    getRet($data, ++$x, --$y, $result, $snapshort);}//看個例子    $result = [];getRet($nums, 0, 0, $result, []);foreach ($result as $pos) {    foreach ($pos as $xy) {        echo "({$xy[0]},{$xy[1]}) => ";    }    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,3)=>(3,4)=>(3,5)=>end
2樓crazyacking
sqrt函數在中的實現是牛頓迭代法吧
1樓crazyacking
sqrt函數在c中的實現是牛頓迭代法吧
Re: 奔跑的Man
@crazyacking,夜貓子~~
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.