国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

第一周算法訓練(dfs)(深度優(yōu)先搜索算法)

這篇具有很好參考價值的文章主要介紹了第一周算法訓練(dfs)(深度優(yōu)先搜索算法)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.什么是dfs,以及算法的基礎是什么?

dfs:深度優(yōu)先搜索算法,是一種用于遍歷或搜索樹或圖的算法.沿著樹的深度遍歷樹的節(jié)點,盡可能深的搜索樹的分支。當節(jié)點v的所在邊都己被探尋過,搜索將回溯到發(fā)現(xiàn)節(jié)點v的那條邊的起始節(jié)點。這一過程一直進行到已發(fā)現(xiàn)從源節(jié)點可達的所有節(jié)點為止。如果還存在未被發(fā)現(xiàn)的節(jié)點,則選擇其中一個作為源節(jié)點并重復以上過程,整個進程反復進行直到所有節(jié)點都被訪問為止。屬于盲目搜索。簡單來說就是一條路走到黑,直到?jīng)]路了,或者找到結果才返回。

深度優(yōu)先搜索算法的基礎:遞歸與回溯

遞歸與回溯是相輔相成的,有遞歸就會有回溯,遞歸函數(shù)的下面部分就是回溯的過程以及回溯的邏輯

回溯是一種純暴力搜索。

2.使用原因

雖然深度優(yōu)先搜索算法的效率很低,但是有些問題只能通過dfs來解決,有些時候多重循環(huán)就照不出來結果

能夠解決的問題有:

1.組合問題? ? ? ? ?

2.切割問題

3.子集問題

4.排列問題

5.棋盤問題

3.如何去理解深度優(yōu)先搜索的回溯算法

回溯算法是一個很抽象的東西,但是所有的回溯算法都可以抽象成一個樹狀結構,可以將其抽象成一個n叉樹問題。樹的深度取決于要搜索問題的層數(shù),樹的寬度取決于每個節(jié)點處理集合的大小。

回溯法的模版:

void 函數(shù)名(參數(shù))//回溯算法的參數(shù)一般比較多,要根據(jù)具體情況進行分析
{
    if(終止條件)
      {
         收集最后節(jié)點結果
         return  ;
      }
//單層搜索的邏輯:
    for(集合的元素)//遍歷的是集合里的每一個元素,也可能是集合節(jié)點的子節(jié)點個數(shù)
      {
          處理節(jié)點
          遞歸函數(shù)
          回溯操作(撤銷處理節(jié)點的操作)
      }
    return ;
}

基本上一般的回溯問題都可以通過這個模版的變形從而解決問題

4.例題以及AC代碼(C語言)

1.第一題

第一周算法訓練(dfs)(深度優(yōu)先搜索算法),算法,深度優(yōu)先

這是洛谷上的一道dfs的入門題,我們通過這題來了解一下dfs

#include <stdio.h>
int n,m,t,p,q;//n和m分別代表迷宮有多少行和列,t代表有多少個障礙物,p和q是障礙物的坐標
int sx,sy,fx,fy;//輸入起始位置和終止位置坐標
int a[6][6];//棋盤數(shù)組
int b[6][6];//標記數(shù)組,若元素是1,則代表這個位置已經(jīng)訪問過了,不用再次訪問
int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}};//要進行操作的集合,分別代表右,下,左,上的移動
int count=0;//統(tǒng)計共有多少種方法
void dfs(int x,int y)//進行回溯的函數(shù)
{
    int dx,dy;//代替x,y進行移動操作,這樣回溯的時候不用回溯x和y,只需要回溯標記就好,更簡潔
    if(x==fx&&y==fy)//終止條件,當x和y到達終止位置時,會將次數(shù)加一,并且終止遞歸
    {
        count++;
        return ;
    }
    for(int i=0;i<4;i++)//遍歷移動集合,進行移動
    {
        dx=x+next[i][0];//移動后的行坐標
        dy=y+next[i][1];//移動后的列坐標
        if(dx<1||dx>n||dy<1||dy>m)//假如數(shù)組越界就可以直接跳過(即邊界的判斷條件)
        {
            continue;
        }
        if(b[dx][dy]==0&&a[dx][dy]==0)//這個位置沒有被訪問過
        {
            b[dx][dy]=1;//標記訪問
            dfs(dx,dy);//繼續(xù)遞歸
            b[dx][dy]=0;//回溯
        }
    }
    return ;
}
int main()
{
    scanf("%d%d%d",&n,&m,&t);
    scanf("%d%d%d%d",&sx,&sy,&fx,&fy);
    b[sx][sy]=1;//將其實位置標記為1,代表一開始就訪問過了
    while(t--)
    {
        scanf("%d%d",&p,&q);
        b[p][q]=1;//將障礙物標記為1,相當于訪問過這樣一視同仁代碼更加簡潔
    }
    dfs(sx,sy);//調用遞歸函數(shù)
    printf("%d\n",count);
}

可以看到這個基礎題的代碼和上述模版十分相似,但是后續(xù)的難題就不能完全依靠模板了,那個只是起到一個輔助的思路,主要還是需要自己思考

2.第二題

第一周算法訓練(dfs)(深度優(yōu)先搜索算法),算法,深度優(yōu)先

首先根據(jù)題意,我們可以知道只有附近八格內,只要連續(xù)就可以構成一個水坑,那么我們就可以想到終止條件就是假如附近八格內沒有水了就可以直接結束了,而函數(shù)里的參數(shù)就是首個出現(xiàn)的水坑,我們要進行循環(huán)的集合就是水坑的附近八格,因此我們可以寫出AC代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-830322.html

#include <stdio.h>
int n,m;
char a[105][105];//定義一個棋盤數(shù)組
int b[105][105];//標記數(shù)組
int count=0;
void dfs(int x,int y)//遞歸函數(shù)
{
    if(a[x][y]=='.')//終止條件就是碰到  .
    { 
        return ;
    }
    int dx,dy;
    for(int i=-1; i<=1; i++)
    {
        for(int j=-1; j<=1; j++)
        {
            dx=x+i;
            dy=y+j;
            if(dx>=0&&dx<=n&&dy>=0&&dy<m&&a[dx][dy]=='W'&&b[dx][dy]==0)
            {
                b[dx][dy]=1;
                dfs(dx,dy);//此處無需回溯,因為需要進行標記
            }
        }
    }
    return ;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0; i<n; i++)
    {
        scanf("%s",a[i]);
    }
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            if(a[i][j]=='W'&&b[i][j]==0)
            {
                dfs(i,j);
                count+=1;
            }
        }
    }
    printf("%d\n",count);
    return 0;
}

到了這里,關于第一周算法訓練(dfs)(深度優(yōu)先搜索算法)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【算法詳解 | DFS算法】深度優(yōu)先搜索解走迷宮問題 | 深度優(yōu)先圖遍歷

    【算法詳解 | DFS算法】深度優(yōu)先搜索解走迷宮問題 | 深度優(yōu)先圖遍歷

    by.Qin3Yu 本文需要讀者掌握 結構體 和 棧 的操作基礎,完整代碼將在文章末尾展示。 特別聲明:本文為了盡可能使用簡單描述,以求簡單明了,可能部分專有名詞定義不準確。 棧相關操作可以參考我的往期博文: 【C++數(shù)據(jù)結構 | 棧速通】使用棧完成十進制數(shù)轉二四八進制數(shù)

    2024年02月03日
    瀏覽(19)
  • Python 算法基礎篇:深度優(yōu)先搜索( DFS )和廣度優(yōu)先搜索( BFS )

    Python 算法基礎篇:深度優(yōu)先搜索( DFS )和廣度優(yōu)先搜索( BFS )

    深度優(yōu)先搜索( DFS )和廣度優(yōu)先搜索( BFS )是兩種常用的圖遍歷算法,用于在圖中搜索目標節(jié)點或遍歷圖的所有節(jié)點。本篇博客將介紹 DFS 和 BFS 算法的基本概念,并通過實例代碼演示它們的應用。 ???? ?? ?? ?? 深度優(yōu)先搜索( DFS )是一種用于遍歷或搜索圖或樹

    2024年02月07日
    瀏覽(53)
  • 深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)兩種算法c++

    深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)兩種算法c++

    深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)是一種用于遍歷或搜索樹圖的一種算法,在這個過程中保證圖或數(shù)的每個結點被訪問且僅被訪問一次,再按照每個結點訪問的順序不同分為深搜和廣搜。 本文只討論這兩種算法在搜索方面的應用! 深度優(yōu)先搜索 ( Depth-First-Search,DFS )它 沿

    2024年02月13日
    瀏覽(20)
  • 圖的遍歷(搜索)算法(深度優(yōu)先算法DFS和廣度優(yōu)先算法BFS)

    圖的遍歷(搜索)算法(深度優(yōu)先算法DFS和廣度優(yōu)先算法BFS)

    從圖的某個頂點出發(fā)訪問遍圖中所有頂點,且每個頂點僅被訪問一次。(連通圖與非連通圖) 1、訪問指定的起始頂點; 2、若當前訪問的頂點的鄰接頂點有未被訪問的,則任選一個訪問之;反之,退回到最近訪問過的頂點;直到與起始頂點相通的全部頂點都訪問完畢; 3、若

    2024年01月17日
    瀏覽(26)
  • 【數(shù)據(jù)結構與算法】搜索算法(深度優(yōu)先搜索 DFS和廣度優(yōu)先搜索 BFS)以及典型算法例題

    【數(shù)據(jù)結構與算法】搜索算法(深度優(yōu)先搜索 DFS和廣度優(yōu)先搜索 BFS)以及典型算法例題

    【數(shù)據(jù)結構與算法】系列文章鏈接: 【數(shù)據(jù)結構與算法】遞推法和遞歸法解題(遞歸遞推算法典型例題) 【數(shù)據(jù)結構與算法】系列文章鏈接: 【數(shù)據(jù)結構與算法】C++的STL模板(迭代器iterator、容器vector、隊列queue、集合set、映射map)以及算法例題 【數(shù)據(jù)結構與算法】系列文章鏈

    2024年04月13日
    瀏覽(31)
  • 如何實現(xiàn)一個簡單的深度優(yōu)先搜索(DFS)算法?

    如何實現(xiàn)一個簡單的深度優(yōu)先搜索(DFS)算法?

    前端入門之旅:探索Web開發(fā)的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅!這個專欄是為那些對Web開發(fā)感興趣、剛剛踏入前端領域的朋友們量身打造的。無論你是完全的新手還是有一些基礎的開發(fā)者,這里都將為你提供一

    2024年02月07日
    瀏覽(22)
  • 【Python搜索算法】深度優(yōu)先搜索(DFS)算法原理詳解與應用,示例+代碼

    【Python搜索算法】深度優(yōu)先搜索(DFS)算法原理詳解與應用,示例+代碼

    目錄 1 基本原理 2 DFS算法流程 3 時間復雜度 4 空間復雜度 5 DFS算法應用案例: 5.1 解決路徑查找問題? 5.2 解決圖的連通性問題 5.3? 拓撲排序 5.4? 在樹結構中進行深度遍歷 深度優(yōu)先搜索(DFS)是一種重要的圖遍歷算法,用于探索圖中的節(jié)點和邊。 DFS 是一種遞歸或棧(堆棧)

    2024年02月06日
    瀏覽(46)
  • DFS(深度優(yōu)先搜索算法)入門保姆級超詳解

    DFS(深度優(yōu)先搜索算法)入門保姆級超詳解

    如題,本篇創(chuàng)作目的在于更精細化理解DFS的運作,篇幅不長,也只是作者的一家之言,只為提供一個對入門者的更精細的解釋。 DFS,深度優(yōu)先搜索算法,首先我們看中文,可以很清楚的理解到這個算法是指搜索操作中優(yōu)先進行深度也就是縱向的數(shù)據(jù)篩查。 看搜索的基本思路

    2024年02月07日
    瀏覽(19)
  • Python算法:深度優(yōu)先搜索—DFS(模板及其樣例)

    Python算法:深度優(yōu)先搜索—DFS(模板及其樣例)

    ? 沿著一條路徑一直搜索下去,在無法搜索時,回退到剛剛訪問過的節(jié)點。 ? 并且每個節(jié)點只能訪問一次。 ? 本質上是持續(xù)搜索,遍歷了所有可能的情況,必然能得到解。 ? 流程是一個樹的形式,每次一條路走到黑。 ? 目的主要是達到被搜索結構的葉結點直到最后一層

    2024年03月24日
    瀏覽(18)
  • 【C++算法】dfs深度優(yōu)先搜索(上) ——【全面深度剖析+經(jīng)典例題展示】

    【C++算法】dfs深度優(yōu)先搜索(上) ——【全面深度剖析+經(jīng)典例題展示】

    ???? 本人簡介:男 ???? 年齡:18 ?? ps:七八天沒更新了欸,這幾天剛搞完元宇宙,上午一直練??,下午背四級單詞和刷題來著,還在忙一些學弟學妹錄制視頻和準備開學一些事,一直沒空出時間來,等 20號練完車,也馬上開學了QAQ。不過今天倒是空出來一些時間,恰好這

    2024年02月02日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包