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

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

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

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

引言

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

問題描述

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

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

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

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

如何解決

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

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

我的思路:

1. 對上面的迷宮進行坐標化,左上角是(0,0),右下角是(3,3),其他點分散在坐標系中
2. 從(0,0)開始
3. 從給定的坐標點開始,先向右搜索,是1的話繼續(xù),是0的話向下搜索,搜索前記錄當前已經(jīng)搜索過的坐標
4. 當坐標等于(3,3)的時候就是一個回溯點了,這個時候也返回
5. 只要不越界,重復第三步驟

看看我的PHP實現(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) {
    //跑到迷宮不存在的空間了,這種事情絕對不能發(fā)生
    return;
  }
  if($data[$x][$y] == "0") {
    //是0的話停止繼續(xù)前進,退回上一狀態(tài)
    return;
  } elseif($data[$x][$y] == "1") {
    //是1的話,記錄最新的坐標到當前已找到的路徑中,繼續(xù)向前搜索
    //如果到達出口,記錄答案并回溯
    $snapshort = array_merge($record, [[$x, $y]]);
    if($x == $xL && $y == $yL) {
      $result[] = array_merge($record, [[$x, $y]]);
      return;
    }
  } else {
    return;
  }
  //向有搜索
  //這里的$snapshort保存當前搜索位置的狀態(tài),等到下次回溯到這里的時候會用到
  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";
}

輸出結(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

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

希望本文所述對大家PHP程序設計有所幫助。

相關文章

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

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

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

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

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

    PHP的全局錯誤處理詳解

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

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

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

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

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

    PHP中if和or運行效率對比

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

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

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

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

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

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

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

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

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

最新評論

开封市| 江都市| 普洱| 永安市| 曲沃县| 马山县| 商南县| 漯河市| 临海市| 安平县| 比如县| 五指山市| 台南县| 庆城县| 商南县| 宜良县| 濮阳市| 腾冲县| 饶河县| 大理市| 故城县| 荆门市| 黎川县| 天等县| 晋城| 廉江市| 青铜峡市| 周口市| 来凤县| 古浪县| 岐山县| 青河县| 永仁县| 南木林县| 临猗县| 调兵山市| 建宁县| 罗山县| 武穴市| 河西区| 轮台县|