久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

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

這篇文章主要介紹了PHP實現基于回溯法求解迷宮問題的方法,結合實例形式詳細分析了回溯法的原理、實現步驟與解決迷宮問題的相關操作技巧,需要的朋友可以參考下

本文實例講述了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數據結構與算法教程》、《php程序設計算法總結》、《php字符串(string)用法總結》、《PHP數組(Array)操作技巧大全》、《PHP常用遍歷算法與技巧總結》及《PHP數學運算技巧總結》

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

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡單分析了插值查找算法的概念、原理并結合實例形式分析了php實現針對有序表插值查找的相關操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實現服務端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實現APP微信支付的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實現的多維數組排序算法,結合實例形式對比分析了php針對多維數組及帶有鍵名的多維數組進行排序相關操作技巧與注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php結合ajaxuploadfile實現無刷新文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細介紹了PHP開發接口使用RSA進行加密解密方法,對此有興趣的朋友可以學習下。
主站蜘蛛池模板: 亚洲成人a v | 天天爽夜夜操 | 天堂久 | 国产精彩视频 | 久久久久国产一区二区三区四区 | 欧美精品一区二区三区蜜桃视频 | 四虎影院免费在线播放 | 亚洲区一区二 | 视频一二三区 | 久久精品91 | 日本午夜精品 | 九九热九九 | 亚洲一区二区三区在线观看免费 | 伊人亚洲 | 亚洲首页| 日韩一级在线 | 日本午夜网站 | 欧美成人高清视频 | 国产欧美日韩在线播放 | 欧美日韩亚洲一区 | h在线看| 中文二区| 欧美a v在线 | 国产2区| 丁香久久| 最新日韩在线 | 国产精品国产精品国产专区不卡 | 亚洲成人av| 国产高清精品在线 | 欧美日韩在线一区二区三区 | 久久久精品一区 | 性欧美精品一区二区三区在线播放 | 日韩精品人成在线播放 | 91麻豆精品国产91久久久资源速度 | 午夜精品一区二区三区免费视频 | 一区二区在线 | 亚洲品质自拍视频网站 | 久久久久综合 | 久久国产综合 | 中文字幕亚洲一区二区三区 | 夜夜夜夜草|