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

首頁 > 語言 > PHP > 正文

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

2024-05-04 23:59:30
字體:
來源:轉載
供稿:網友

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

引言

最近在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. 從給定的坐標點開始,先向右搜索,是1的話繼續,是0的話向下搜索,搜索前記錄當前已經搜索過的坐標
4. 當坐標等于(3,3)的時候就是一個回溯點了,這個時候也返回
5. 只要不越界,重復第三步驟

看看我的PHP實現:

<?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) {    //跑到迷宮不存在的空間了,這種事情絕對不能發生    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

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


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 黄陵县| 科尔| 汶川县| 西贡区| 香格里拉县| 富裕县| 呼伦贝尔市| 新源县| 灵宝市| 蛟河市| 神木县| 宿松县| 宜君县| 封开县| 峡江县| 三门县| 泉州市| 东乡族自治县| 海盐县| 巴彦淖尔市| 综艺| 德兴市| 元江| 沙田区| 云梦县| 称多县| 拉萨市| 乐业县| 襄樊市| 浦县| 成武县| 鸡东县| 化德县| 禹州市| 新密市| 囊谦县| 新竹市| 阳高县| 抚顺县| 灵璧县| 和龙市|