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

C++回溯算法之深度優(yōu)先搜索詳細(xì)介紹

 更新時(shí)間:2023年01月13日 08:48:26   作者:子夜的星  
回溯在迷宮搜索中使用很常見,就是這條路走不通,然后返回前一個(gè)路口,繼續(xù)下一條路。回溯算法說白了就是窮舉法,下面讓我們一起來看看回溯算法中深度優(yōu)先搜索吧

一、前言

本文介紹了經(jīng)典搜索算法: 深度優(yōu)先搜索(DFS)

兩個(gè)小故事:

岳云鵬的相聲:孫越的爸爸帶他參觀家里面的聚寶盆,走到了一個(gè)密室門前,密室的門上上了一把鎖,孫越的爸爸身上帶了一萬多把鑰匙,他還忘了哪一把鑰匙能打開個(gè)門了,于是就一把把試,試到了最后一把,門開了。

你叫DFS,在一次校園活動(dòng)中你認(rèn)識了三個(gè)非常漂亮的女孩,你想和她們進(jìn)一步發(fā)展。于是,你選擇了其中一個(gè)人,并對她展開了追求,你采用了 聊天->約會->表白 的戀愛三部曲。但是很不幸,她拒絕了你,于是你添加了第二個(gè)女生的微信,同樣采取了你常用的三部曲。很不幸,第二個(gè)女生也拒絕你了。但是,你沒有被困難打倒,于是你添加了第三個(gè)女生的微信,依舊是這三部曲,終于,第三個(gè)女生答應(yīng)了你。你的朋友詢問你,是如何找到女朋友的?,你答:我采用了DFS對象法

二、基本概念

1.簡單介紹

前言中的兩個(gè)小故事,孫越的爸爸找鑰匙開門的過程和DFS小朋友找女朋友都是一個(gè)搜索過程。

簡而言之,搜索就是嘗試問題中所有的可能性,在所有的可能性中找到正確的結(jié)果。而深度優(yōu)先搜索用一句話概括就是:“ 一直往下走,走到最后還是走不通,那就換條路再走,直到無路可走。”用一個(gè)成語來形容,那就是 :“ 不撞南墻不回頭。”

2.官方概念

以下是維基百科上的解釋:

深度優(yōu)先搜索算法(英語:Depth-First-Search,DFS)是一種用于遍歷或搜索樹或圖的算法。這個(gè)算法會盡可能深地搜索樹的分支。當(dāng)節(jié)點(diǎn)v的所在邊都己被探尋過,搜索將回溯到發(fā)現(xiàn)節(jié)點(diǎn)v的那條邊的起始節(jié)點(diǎn)。這一過程一直進(jìn)行到已發(fā)現(xiàn)從源節(jié)點(diǎn)可達(dá)的所有節(jié)點(diǎn)為止。如果還存在未被發(fā)現(xiàn)的節(jié)點(diǎn),則選擇其中一個(gè)作為源節(jié)點(diǎn)并重復(fù)以上過程,整個(gè)進(jìn)程反復(fù)進(jìn)行直到所有節(jié)點(diǎn)都被訪問為止。這種算法不會根據(jù)圖的結(jié)構(gòu)等信息調(diào)整執(zhí)行策略

三、動(dòng)圖分析

DFS會從初始節(jié)點(diǎn)出發(fā),按預(yù)定的順序擴(kuò)展到下一個(gè)節(jié)點(diǎn),然后從下一節(jié)點(diǎn)出發(fā)繼續(xù)擴(kuò)展新的節(jié)點(diǎn),不斷遞歸執(zhí)行這個(gè)過程,直到某個(gè)節(jié)點(diǎn)不能再擴(kuò)展下一個(gè)節(jié)點(diǎn)為止。此時(shí),則返回上一個(gè)節(jié)點(diǎn)重新尋找一個(gè)新的擴(kuò)展節(jié)點(diǎn)。如此搜索下去,直到找到目標(biāo)節(jié)點(diǎn),或者搜索完所有節(jié)點(diǎn)為止。

動(dòng)圖:

四、模板框架

以下模板來自于大佬Carl:

void DFS(參數(shù)){
    if (終止條件){
        做要做的事
        return ;//退出 
    }
    for (選擇:本層集合中元素(樹中節(jié)點(diǎn)孩子的數(shù)量就是集合的大?。?
    	{
    		處理節(jié)點(diǎn);
            DFS(路徑,選擇列表);
            回溯:回到?jīng)]用過
        }
    return ;//退出 
}

五、例題分析

組合問題

題干描述

力扣77題:組合

給定兩個(gè)整數(shù) nk,返回范圍 [1, n] 中所有可能的 k 個(gè)數(shù)的組合。

你可以按 任何順序 返回答案。

輸入:n = 4, k = 2

輸出:

[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

輸入:n = 1, k = 1

輸出:

[[1]]

思路分析

C語言代碼:

int* path;
int pathTop;
int** ans;
int ansTop;
void DFS(int n, int k,int startIndex) {
    //當(dāng)path中元素個(gè)數(shù)為k個(gè)時(shí),我們需要將path數(shù)組放入ans二維數(shù)組中
    if(pathTop == k) {
        //path數(shù)組為我們動(dòng)態(tài)申請,若直接將其地址放入二維數(shù)組,path數(shù)組中的值會隨著我們回溯而逐漸變化
        //因此創(chuàng)建新的數(shù)組存儲path中的值
        int* temp = (int*)malloc(sizeof(int) * k);
        int i;
        for(i = 0; i < k; i++) {
            temp[i] = path[i];
        }
        ans[ansTop++] = temp;
        return ;
    }
    int j;
    for(j = startIndex; j <=n ;j++) {
        //將當(dāng)前結(jié)點(diǎn)放入path數(shù)組
        path[pathTop++] = j;
        //進(jìn)行遞歸
        DFS(n, k, j + 1);
        //進(jìn)行回溯,將數(shù)組最上層結(jié)點(diǎn)彈出
        pathTop--;
    }
}
int** combine(int n, int k, int* returnSize, int** returnColumnSizes){
    //path數(shù)組存儲符合條件的結(jié)果
    path = (int*)malloc(sizeof(int) * k);
    //ans二維數(shù)組存儲符合條件的結(jié)果數(shù)組的集合。(數(shù)組足夠大,避免極端情況)
    ans = (int**)malloc(sizeof(int*) * 10000);
    pathTop = ansTop = 0;
    DFS(n, k, 1);
    //最后的返回大小為ans數(shù)組大小
    *returnSize = ansTop;
    //returnColumnSizes數(shù)組存儲ans二維數(shù)組對應(yīng)下標(biāo)中一維數(shù)組的長度(都為k)
    *returnColumnSizes = (int*)malloc(sizeof(int) *(*returnSize));
    int i;
    for(i = 0; i < *returnSize; i++) {
        (*returnColumnSizes)[i] = k;
    }
    //返回ans二維數(shù)組
    return ans;
}

到此這篇關(guān)于C++回溯算法之深度優(yōu)先搜索詳細(xì)介紹的文章就介紹到這了,更多相關(guān)C++深度優(yōu)先搜索內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C/C++實(shí)現(xiàn)通訊錄管理系統(tǒng)(附源碼)

    C/C++實(shí)現(xiàn)通訊錄管理系統(tǒng)(附源碼)

    這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-12-12
  • Qt實(shí)現(xiàn)無邊框窗口的示例代碼

    Qt實(shí)現(xiàn)無邊框窗口的示例代碼

    本文主要介紹了Qt實(shí)現(xiàn)無邊框窗口的示例代碼,主要包括鼠標(biāo)光標(biāo)在不同區(qū)域的變化,關(guān)閉拖動(dòng)窗口,窗口支持任意拉伸等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • C++實(shí)現(xiàn)迷宮小游戲

    C++實(shí)現(xiàn)迷宮小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)迷宮小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++自定義數(shù)據(jù)類型方法詳情

    C++自定義數(shù)據(jù)類型方法詳情

    這篇文章主要介紹了C++自定義數(shù)據(jù)類型方法詳情,總結(jié)了兩種方法,分別是typedef聲明和枚舉類型enum,相關(guān)內(nèi)容需要的小伙伴可以參考下面文章內(nèi)容,希望對你的學(xué)習(xí)有所幫助
    2022-03-03
  • C++判斷矩形相交的方法

    C++判斷矩形相交的方法

    這篇文章主要介紹了C++判斷矩形相交的方法,涉及C++針對平面坐標(biāo)數(shù)學(xué)運(yùn)算的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C語言的冒泡排序和快速排序算法使用實(shí)例

    C語言的冒泡排序和快速排序算法使用實(shí)例

    這篇文章主要介紹了C語言的冒泡排序和快速排序算法使用實(shí)例,示例題目也是ACM練習(xí)當(dāng)中的基礎(chǔ)習(xí)題,需要的朋友可以參考下
    2015-08-08
  • C++11 模板參數(shù)的“右值引用”是轉(zhuǎn)發(fā)引用嗎

    C++11 模板參數(shù)的“右值引用”是轉(zhuǎn)發(fā)引用嗎

    這篇文章主要介紹了C++11 模板參數(shù)的“右值引用”是轉(zhuǎn)發(fā)引用嗎,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 淺談c和c++的某些小區(qū)別

    淺談c和c++的某些小區(qū)別

    下面小編就為大家?guī)硪黄獪\談c和c++的某些小區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • C/C++中宏定義(#define)

    C/C++中宏定義(#define)

    #define命令是C語言中的一個(gè)宏定義命令,它用來將一個(gè)標(biāo)識符定義為一個(gè)字符串,該標(biāo)識符被稱為宏名,被定義的字符串稱為替換文本。接下拉通過本文給大家分享C/C++中宏定義(#define)知識,需要的朋友參考下
    2017-02-02
  • C語言 自增自減運(yùn)算的區(qū)別詳解及實(shí)例

    C語言 自增自減運(yùn)算的區(qū)別詳解及實(shí)例

    這篇文章主要介紹了C語言中的++a和a++的區(qū)別詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評論

昌黎县| 太仓市| 甘孜| 湘阴县| 三河市| 涿州市| 和静县| 彰化县| 昭通市| 雅安市| 和平县| 达州市| 栾川县| 德庆县| 贵南县| 龙口市| 阿勒泰市| 大同市| 额尔古纳市| 平安县| 武宣县| 金寨县| 色达县| 关岭| 仙游县| 同德县| 高碑店市| 克什克腾旗| 顺平县| 龙胜| 军事| 咸丰县| 正镶白旗| 怀化市| 柳州市| 涡阳县| 津市市| 北流市| 丁青县| 威信县| 电白县|