国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

回溯法求解迷宮問(wèn)題

2019-11-14 14:48:12
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

引言

最近在leetcode上看了些算法題,有些看著很簡(jiǎn)單的很常用的東西,竟然一下子想不出來(lái)怎么求解,比如說(shuō):實(shí)現(xiàn)sqrt函數(shù),求數(shù)組的排列。如果高數(shù)學(xué)的不好,這些看似簡(jiǎn)單的問(wèn)題,第一次碰到也會(huì)感覺(jué)很難求解,當(dāng)然了,今天要說(shuō)的是這樣一個(gè)問(wèn)題,求解迷宮的所有解,這個(gè)問(wèn)題的求解用到了回溯法的思想,不了解這個(gè)思想的話(huà),很多稍微復(fù)雜點(diǎn)的問(wèn)題都很難解了。

問(wèn)題描述

這個(gè)問(wèn)題是在實(shí)在瞎逛的時(shí)候碰到的,具體哪里記不太清了。

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

上面是一個(gè)迷宮,左上角是入口,右下角是出口,小萌(對(duì),你沒(méi)看錯(cuò),是長(zhǎng)了草的小明)從入口進(jìn)入,從出口逃出(1個(gè)小時(shí)逃不出會(huì)被X怪物吃掉),其中1表示可以通行,0表示不能通行,只能向右和向下兩個(gè)方向走,求出所有的小萌可能逃生的路線(xiàn)。

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

如何解決

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

回溯法(探索與回溯法)是一種選優(yōu)搜索法,又稱(chēng)為試探法,按選優(yōu)條件向前搜索,以達(dá)到目標(biāo)。但當(dāng)探索到某一步時(shí),發(fā)現(xiàn)原先選擇并不優(yōu)或達(dá)不到目標(biāo),就退回一步重新選擇,這種走不通就退回再走的技術(shù)為回溯法,而滿(mǎn)足回溯條件的某個(gè)狀態(tài)的點(diǎn)稱(chēng)為“回溯點(diǎn)”。

我的思路:

  • 對(duì)上面的迷宮進(jìn)行坐標(biāo)化,左上角是(0,0),右下角是(3,3),其他點(diǎn)分散在坐標(biāo)系中
  • 從(0,0)開(kāi)始
  • 從給定的坐標(biāo)點(diǎn)開(kāi)始,先向右搜索,是1的話(huà)繼續(xù),是0的話(huà)向下搜索,搜索前記錄當(dāng)前已經(jīng)搜索過(guò)的坐標(biāo)
  • 當(dāng)坐標(biāo)等于(3,3)的時(shí)候就是一個(gè)回溯點(diǎn)了,這個(gè)時(shí)候也返回
  • 只要不越界,重復(fù)第三步驟

看看我的php實(shí)現(xiàn):

<?php$nums = [    [1,1,1,1,1,1],    [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){    $snapshort = [];    $xL = count($data) - 1;    $yL = count($data[0]) - 1;    if($x > $xL || $y > $yL) {        //跑到迷宮不存在的空間了,這種事情絕對(duì)不能發(fā)生        return;    }    if($data[$x][$y] == "0") {        //是0的話(huà)停止繼續(xù)前進(jìn),退回上一狀態(tài)        return;    } elseif($data[$x][$y] == "1") {        //是1的話(huà),記錄最新的坐標(biāo)到當(dāng)前已找到的路徑中,繼續(xù)向前搜索        //如果到達(dá)出口,記錄答案并回溯        $snapshort = array_merge($record, [[$x, $y]]);        if($x == $xL && $y == $yL) {            $result[] = array_merge($record, [[$x, $y]]);            return;        }    } else {        return;    }           //向有搜索    //這里的$snapshort保存當(dāng)前搜索位置的狀態(tài),等到下次回溯到這里的時(shí)候會(huì)用到    getRet($data, $x, ++$y, $result, $snapshort);    //向下搜索    getRet($data, ++$x, --$y, $result, $snapshort);}//看個(gè)例子    $result = [];getRet($nums, 0, 0, $result, []);foreach ($result as $pos) {    foreach ($pos as $xy) {        echo "({$xy[0]},{$xy[1]}) => ";    }    echo "end/n";}//輸出結(jié)果(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

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 简阳市| 涡阳县| 东辽县| 阜阳市| 辉县市| 六安市| 武平县| 尼木县| 沧州市| 湖北省| 青海省| 科尔| 响水县| 孟村| 张家川| 五指山市| 仙居县| 高邮市| 双牌县| 新源县| 南雄市| 海城市| 嫩江县| 同仁县| 七台河市| 达州市| 尚志市| 高青县| 龙陵县| 桐庐县| 巴林左旗| 榆林市| 万全县| 元氏县| 抚远县| 特克斯县| 奈曼旗| 荥经县| 隆子县| 新竹县| 三门县|