日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

深度优先搜索_0基础学算法 搜索篇第一讲 深度优先搜索

發(fā)布時(shí)間:2023/11/27 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度优先搜索_0基础学算法 搜索篇第一讲 深度优先搜索 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

0基礎(chǔ)學(xué)算法 搜索篇第一講 深度優(yōu)先搜索

  相信絕大多數(shù)人對于深度優(yōu)先搜索和廣度優(yōu)先搜索是不會特別陌生的,如果我這樣說似乎你沒聽說過,那如果我說dfs和bfs呢?先不說是否學(xué)習(xí)過它們,至少它們的大名應(yīng)該是都是聽說過的吧,深度優(yōu)先搜索(Depth-First-Search)和廣度優(yōu)先搜索(Breadth-First-Search)同為搜索(Search)中的兩個(gè)大類。顧名思義,他們的作用便是在一定的元素當(dāng)中選取符合要求的元素,有些情況下無論你使用dfs或bfs都能得出結(jié)果,但是事實(shí)上它們兩個(gè)本質(zhì)上是有區(qū)別的

第一講深度優(yōu)先搜索(Depth-First-Search)

  深度優(yōu)先搜索是一種用途很廣泛的算法,這種搜索方法使用的是一種比較基本的概念----遞歸,dfs就是基于遞歸而產(chǎn)生的一種嚴(yán)格意義上的算法,最開始的時(shí)候dfs是一種在開發(fā)爬蟲早期使用較多的方法,它的目的是要達(dá)到被搜索結(jié)構(gòu)的葉結(jié)點(diǎn)。那么深度優(yōu)先搜索到底是如何實(shí)現(xiàn)的呢?

  要能理解dfs,首先理解遞歸是必要的(遞歸鏈接https://www.cnblogs.com/qj-Network-Box/p/12729230.html),在理解了遞歸后,就可以來看看這種算法的思想了

  假如你要搜尋節(jié)點(diǎn)①~節(jié)點(diǎn)⑩,然后你通過遍歷找到了節(jié)點(diǎn)①,那么接下來你可以使用dfs找到接下來的節(jié)點(diǎn)

  

找到第一個(gè)節(jié)點(diǎn)是必須的,然后就可以接著往下遞歸

然后就要一路找到底,即一直找到要回溯的節(jié)點(diǎn)

如果到了節(jié)點(diǎn)⑤的時(shí)候又找到了可以繼續(xù)往下遞歸的條件,那么還可以繼續(xù)往下搜索

然后在②處又找到了下面的一個(gè)節(jié)點(diǎn)

到了新的節(jié)點(diǎn)又可以向下搜搜

雖然現(xiàn)在回溯到了①,但是搜索還差幾步,因?yàn)棰僭偻逻€有節(jié)點(diǎn)

要一直等到這里才是dfs最終結(jié)束的地方

?以上便是dfs的基本思想了,但是呢dfs并不是一種一成不變的算法,事實(shí)上不同的情況下所寫出來的dfs是不同的,但是思路差不多就類似以上

深度優(yōu)先搜索(Depth-First-Search)的例題

  在某個(gè)神奇的網(wǎng)站上,你總可以找到一些有趣的題鞏固你學(xué)的知識,題目鏈接-->https://www.luogu.com.cn/problem/P1162

  這一道題算是一道比較基礎(chǔ)的練習(xí)題吧(應(yīng)該),其實(shí)這道題在你能夠理解dfs的情況下,并找到思路的情況下應(yīng)該是手到擒來的事。

  首先我們來仔細(xì)地讀一讀題大概意思就是被1框住的0要改寫成2,我想很多人看到題的第一反應(yīng)是想著怎么區(qū)別圈里面和圈外面的0,然后把圈里面的0改成2,似乎這個(gè)思路只有一個(gè)難點(diǎn),那就是如何確定一個(gè)0到底處在圈里還是圈外,我開始也是這么想的,然后我想到了一個(gè)解決辦法,如下圖

一般的情況就如左圖,所以我后來的分析都是基于左圖的

然后我就想到了這個(gè)判定方法,也許你也想到了,但是我在實(shí)現(xiàn)這種方法的時(shí)候我發(fā)現(xiàn)了一個(gè)很大的瑕疵,假如那個(gè)圈不是規(guī)則的,而且不僅不規(guī)則,而且還是凹多邊形這種思路就會出問題,問題如下圖所示

如果測試點(diǎn)給的是這樣圖形,之前的判定方法就徹底失效了,因?yàn)楹苊黠@這個(gè)本來是一個(gè)在圈外的點(diǎn),卻會被判定成圈內(nèi)的,那到底該如何識別一個(gè)0到底是圈外還是圈內(nèi)呢?說實(shí)話,我到現(xiàn)在還是沒想出來,但是很多時(shí)候我們就可以使用逆向思維大法,既然很難判定是否是圈內(nèi)的,那就反過來判斷他是不是圈外的不就完了?首先我們可以確定一個(gè)0處于方陣邊緣處肯定不是圈內(nèi)的,所以我們可以通過這個(gè)方法可以先找到邊緣的零,那么,與它相鄰的0以及相鄰于與他相鄰的0定然也是在圈外的,那么這道題dfs的思路也好說了,找到一個(gè)圈外邊緣的0,標(biāo)記一下,然后搜索與他相鄰的0,并標(biāo)記后繼續(xù)搜索,由于題目要求,我們每到一點(diǎn)只要向周圍四個(gè)方向搜索即可

供上搜索部分的代碼

 1 int n,a[35][35];  2 int x1[4]={0,1,0,-1}; 3 int y1[4]={1,0,-1,0};//四個(gè)方向 4 void dfs(int x,int y) 5 { 6     a[x][y]=5; 7     for(int i=0;i<4;i++) 8  ? ?{ 9         if(x+x1[i]>=0&&x+x1[i]=0&&y+y1[i]<n)10  ? ? ? ?{11             if(a[x+x1[i]][y+y1[i]]==0)    dfs(x+x1[i],y+y1[i]);//dfs12  ? ? ? ?}13  ? ?}14 }

但是這道題只搜索這一次肯定是不夠的,我們還需要考慮其他情況,比如下圖

這種情況下有兩塊不在圈內(nèi)的區(qū)域,所以我們需要不止一次地運(yùn)行dfs,也就是說我們在主函數(shù)中可以將他的邊緣“走”一圈以確保每一塊圈外的0都可以被標(biāo)記到

供上主函數(shù)+dfs

#includeusing namespace std;int n,a[35][35]; int x1[4]={0,1,0,-1};int y1[4]={1,0,-1,0};void dfs(int x,int y)
{
? ?a[x][y]=5; ? ?for(int i=0;i<4;i++)
? ?{ ? ? ? ?if(x+x1[i]>=0&&x+x1[i]=0&&y+y1[i]<n)
? ? ? ?{ ? ? ? ? ? ?if(a[x+x1[i]][y+y1[i]]==0) dfs(x+x1[i],y+y1[i]);
? ? ? ?}
? ?}
}int main(){
? ?cin>>n; ? ?for(int i=0;i) ? ?for(int j=0;j)
? ?{
? ? ? ?cin>>a[i][j];
? ?} ? ?for(int i=0;i) ? ?for(int j=0;j)
? ?{ ? ? ? ?if((i==0||i==n-1)&&a[i][j]==0) dfs(i,j); ? ? ? ?else if(i>0&&(j==0||j==n-1)&&a[i][j]==0) dfs(i,j);
? ?}
? ?pp(); ? ?return 0;
}

現(xiàn)在的代碼就可以實(shí)現(xiàn)把所有不在圈里的0標(biāo)記成5,在圈里的不變,不過代碼還差最后一步,因?yàn)槲覀儤?biāo)記的時(shí)候?qū)⑷ν獾?標(biāo)記成5,所以輸出的時(shí)候要將所有是5的地方輸出0,將原本是0的地方輸出2,所以將這種輸出處理一下就完成了

完整代碼

#includeusing namespace std;int n,a[35][35]; int x1[4]={0,1,0,-1};int y1[4]={1,0,-1,0};void pp() ? ? ? ?
{ ? ?for(int i=0;i)
? ?{ ? ? ? ?for(int j=0;j)
? ? ? ?{ ? ? ? ? ? ?if(a[i][j]==5) cout<<0; ? ? ? ? ? ?else if(a[i][j]==1) cout<<1; ? ? ? ? ? ?else if(a[i][j]==0) cout<<2;
? ? ? ? ? ?cout<<" ";
? ? ? ?}
? ? ? ?cout<<endl;
? ?}
}void dfs(int x,int y)
{
? ?a[x][y]=5; ? ?for(int i=0;i<4;i++)
? ?{ ? ? ? ?if(x+x1[i]>=0&&x+x1[i]=0&&y+y1[i]<n)
? ? ? ?{ ? ? ? ? ? ?if(a[x+x1[i]][y+y1[i]]==0) dfs(x+x1[i],y+y1[i]);
? ? ? ?}
? ?}
}int main(){
? ?cin>>n; ? ?for(int i=0;i) ? ?for(int j=0;j)
? ?{
? ? ? ?cin>>a[i][j];
? ?} ? ?for(int i=0;i) ? ?for(int j=0;j)
? ?{ ? ? ? ?if((i==0||i==n-1)&&a[i][j]==0) dfs(i,j); ? ? ? ?else if(i>0&&(j==0||j==n-1)&&a[i][j]==0) dfs(i,j);
? ?}
? ?pp(); ? ?return 0;
}

本期的內(nèi)容就到這里了,如果你覺得對你有幫助,那么幫忙把贊?點(diǎn)一下吧,如果還期待我日后的表現(xiàn),就點(diǎn)個(gè)關(guān)注?好了,我們下期說說bfs,再見!

總結(jié)

以上是生活随笔為你收集整理的深度优先搜索_0基础学算法 搜索篇第一讲 深度优先搜索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久影视大全 | 奇米影视777在线观看 | 性xxxxxxxxx18欧美 | 97自拍视频在线 | 国产伦精品视频一区二区三区 | 中国精品视频 | 草色网| 久久久久久99精品 | 日本高清在线观看 | jlzzjlzz国产精品久久 | 日日夜夜91 | 午夜影院福利社 | 毛片a | 五月婷婷综合在线观看 | 秋葵视频污 | 嫩草研究院在线 | 污污视频在线免费观看 | 超碰首页 | 影音先锋中文字幕人妻 | 性人久久久久 | 五月婷婷激情四射 | 九九热视频精品 | 免费观看一区二区三区 | 亚洲人吸女人奶水 | 日本少妇一区 | 少妇久久久久久被弄到高潮 | 午夜精品久久久久久久99老熟妇 | 久久久男人的天堂 | 国产一区二区免费 | 黄色av成人 | 丰满少妇在线观看bd | 夜夜操av | 玖玖在线免费视频 | 一级黄色裸体片 | 中国一级特黄录像播放 | 野花视频在线观看免费 | 又黄又爽又色视频 | 国产第一精品视频 | 亚洲aaa视频 | 蜜桃做爰免费网站 | 久久精品视频一区二区 | 精产国产伦理一二三区 | 欧美一区二区在线视频 | 中国女人毛茸茸 | 亚洲av综合一区 | 国产一级黄色 | 秋霞二区 | 娇妻之欲海泛舟无弹窗笔趣阁 | 久久成人精品一区二区 | 久久99久久精品 | 国产视频麻豆 | 夫妻自拍偷拍 | 亚洲国产系列 | 亚洲综合在线网 | 91手机视频| 天天摸天天操天天爽 | 美女靠逼视频网站 | 成人av高清在线 | 午夜影院在线观看视频 | 在线视频精品一区 | 国产伦精品一区二区三区精品 | 国产一区中文字幕 | 春草 | av网站亚洲| 日韩成人看片 | 秋霞一级全黄大片 | 91精品国产一区 | 国产第四页 | 三叶草欧洲码在线 | 欧美黄色免费视频 | 伊人久久五月天 | 91视频在线观看 | 色婷婷777| 精国产人伦一区二区三区 | 岛国精品 | 欧美日韩在线观看一区 | 久久中文字幕人妻 | 免费在线观看av网址 | 国产色一区| 在线观看福利网站 | 国产三级伦理片 | av看片| 国产经典久久 | 无码人妻丰满熟妇啪啪网站 | 久久视频精品 | 亚洲不卡在线 | 日本不卡视频一区 | 999久久久久 | 嫩草影院一区二区 | av电影中文字幕 | 久久精品无码一区二区三区免费 | 国产视频在线观看一区二区 | 超碰免费在线播放 | 成人免费毛片视频 | 成年人网站黄色 | 日韩成人高清视频在线观看 | 夜夜夜爽| 精品无码一区二区三区免费 | 男女男精品视频 |