最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP實(shí)現(xiàn)基于回溯法求解迷宮問題的方法詳解

 更新時(shí)間:2017年08月17日 10:20:08   作者:奔跑的Man  
這篇文章主要介紹了PHP實(shí)現(xiàn)基于回溯法求解迷宮問題的方法,結(jié)合實(shí)例形式詳細(xì)分析了回溯法的原理、實(shí)現(xiàn)步驟與解決迷宮問題的相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了PHP實(shí)現(xiàn)基于回溯法求解迷宮問題的方法。分享給大家供大家參考,具體如下:

引言

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

問題描述

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

1   1   1   1
0   1   0   1
0   1   0   1
0   1   1   1

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

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

如何解決

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

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

我的思路:

1. 對(duì)上面的迷宮進(jìn)行坐標(biāo)化,左上角是(0,0),右下角是(3,3),其他點(diǎn)分散在坐標(biāo)系中
2. 從(0,0)開始
3. 從給定的坐標(biāo)點(diǎn)開始,先向右搜索,是1的話繼續(xù),是0的話向下搜索,搜索前記錄當(dāng)前已經(jīng)搜索過的坐標(biāo)
4. 當(dāng)坐標(biāo)等于(3,3)的時(shí)候就是一個(gè)回溯點(diǎn)了,這個(gè)時(shí)候也返回
5. 只要不越界,重復(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的話停止繼續(xù)前進(jìn),退回上一狀態(tài)
    return;
  } elseif($data[$x][$y] == "1") {
    //是1的話,記錄最新的坐標(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

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《php程序設(shè)計(jì)算法總結(jié)》、《php字符串(string)用法總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《PHP常用遍歷算法與技巧總結(jié)》及《PHP數(shù)學(xué)運(yùn)算技巧總結(jié)

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • PHP生成隨機(jī)數(shù)的方法總結(jié)

    PHP生成隨機(jī)數(shù)的方法總結(jié)

    本篇文章給大家總結(jié)了PHP生成隨機(jī)數(shù)的方法并把相關(guān)的代碼做了分享,有需要的讀者們參考學(xué)習(xí)下吧。
    2018-03-03
  • PHP驗(yàn)證碼類代碼( 最新修改,完全定制化! )

    PHP驗(yàn)證碼類代碼( 最新修改,完全定制化! )

    PHP驗(yàn)證碼類代碼,需要的朋友可以參考下。
    2010-12-12
  • PHP的全局錯(cuò)誤處理詳解

    PHP的全局錯(cuò)誤處理詳解

    php自有try{throw{}}catch{}異常/錯(cuò)誤捕獲系統(tǒng),難以在生產(chǎn)環(huán)境中運(yùn)用;生產(chǎn)環(huán)境中,我們一般要求,一旦出現(xiàn)異常/錯(cuò)誤,php立刻結(jié)束腳本,向訪客瀏覽器輸出出錯(cuò)提示,并通過自定義函數(shù)向管理員發(fā)送消息
    2016-04-04
  • PHP使用反向Ajax技術(shù)實(shí)現(xiàn)在線客服系統(tǒng)詳解

    PHP使用反向Ajax技術(shù)實(shí)現(xiàn)在線客服系統(tǒng)詳解

    這篇文章主要介紹了PHP使用反向Ajax技術(shù)實(shí)現(xiàn)在線客服系統(tǒng),簡單描述了反向ajax的概念、原理及使用反向ajax實(shí)現(xiàn)在線客服的相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • PHP輸出XML到頁面的3種方法詳解

    PHP輸出XML到頁面的3種方法詳解

    本篇文章是對(duì)PHP輸出XML到頁面的3種方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • PHP中if和or運(yùn)行效率對(duì)比

    PHP中if和or運(yùn)行效率對(duì)比

    這篇文章主要介紹了PHP中if和or運(yùn)行效率對(duì)比,有助于深入了解PHP程序中相近語句的效率對(duì)比,對(duì)于編寫高質(zhì)量的PHP程序有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • PHP入門教程之正則表達(dá)式基本用法實(shí)例詳解(正則匹配,搜索,分割等)

    PHP入門教程之正則表達(dá)式基本用法實(shí)例詳解(正則匹配,搜索,分割等)

    這篇文章主要介紹了PHP入門教程之正則表達(dá)式基本用法,結(jié)合實(shí)例形式分析了正則表達(dá)式的結(jié)構(gòu)、原理及正則匹配、搜索、分割、元子符、修飾符等相關(guān)概念與操作技巧,需要的朋友可以參考下
    2016-09-09
  • Linux下實(shí)現(xiàn)PHP多進(jìn)程的方法分享

    Linux下實(shí)現(xiàn)PHP多進(jìn)程的方法分享

    PHP多進(jìn)程:使用PHP的Process Control Functions(PCNTL/線程控制函數(shù)),需要的朋友可以參考下
    2012-08-08
  • PHP實(shí)現(xiàn)的多維數(shù)組排序算法分析

    PHP實(shí)現(xiàn)的多維數(shù)組排序算法分析

    這篇文章主要介紹了PHP實(shí)現(xiàn)的多維數(shù)組排序算法,結(jié)合實(shí)例形式對(duì)比分析了php針對(duì)多維數(shù)組及帶有鍵名的多維數(shù)組進(jìn)行排序相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-02-02
  • php實(shí)現(xiàn)購物車功能(上)

    php實(shí)現(xiàn)購物車功能(上)

    這篇文章主要介紹了php實(shí)現(xiàn)購物車功能的全部代碼,提出了需求分析、解決方案、數(shù)據(jù)庫的創(chuàng)建,幫助大家輕輕松松實(shí)現(xiàn)購物車功能,感興趣的小伙伴們可以參考一下
    2016-01-01

最新評(píng)論

固镇县| 巨野县| 包头市| 浙江省| 顺平县| 太康县| 集安市| 周口市| 濮阳县| 河西区| 时尚| 清远市| 洛隆县| 重庆市| 蚌埠市| 来安县| 自治县| 白河县| 渝中区| 漳平市| 交口县| 大连市| 延川县| 建瓯市| 阿瓦提县| 抚顺县| 留坝县| 江西省| 阜新| 论坛| 泰和县| 乐都县| 遵义市| 曲周县| 宁国市| 绥阳县| 高清| 海伦市| 抚州市| 泾阳县| 清流县|