搜尋(深搜 廣搜)

2021-08-16 17:59:25 字數 2377 閱讀 4630

我記得在遙遠的2023年,我會敲的搜尋也只有暴力列舉了。那個時候的我深搜剛會一丟丟,所以也只配切切水題,然而經常死迴圈re那是肯定的。如今的我因為在多次比賽中都死於搜尋,那就必須得認真磕一下了。

其實是這樣的:我眼裡認為的暴力就真的只是暴力,暴力無非就兩種:列舉打表和模擬。然而在這麼多次比賽後,我總能聽到那些dalao在那邊說,這道題麼暴力可以拿多少多少分。我聽了一臉懵逼。我怎麼就一分都拿不到。這個時候我才如夢初醒,發現他們說的暴力其實都是指深搜。於是我就不得不去學深搜了。

然而,事實上,我發現深搜真的很簡單。

於是,我切了好多題庫第三頁上的搜尋題,有深搜的,也有廣搜的。

我還記得那個時候稚嫩的我連那麼簡單的廣搜都聽不懂,還是涵神講的。我竟然都聽不懂。現在我發現廣搜也就那樣。所以我估計那時候我是因為對佇列的理解不夠深刻導致的。

ok,板子來幾個。

直接深搜:從每乙個非0的數開始搜,如果碰到與它相鄰的非0的數,那就把它變成0。

#include

using

namespace

std;

int m,n,ans;

char a[110][110];

string s;

inline

int read()

void dfs(int x,int y)

int main()

for (int i=1;i<=m;++i)

for (int j=1;j<=n;++j)

if (a[i][j]!='0')

printf("%d\n",ans);

return

0;}

深搜+回溯:要多開乙個b陣列標記該點是否被訪問過,如果已經訪問過了再去訪問就會死迴圈。

#include

using namespace std;

int n,m,t,sx,sy,fx,fy,x,y,ans;

bool a[10][10],b[10][10];

inline int

read()

void dfs(int

x,int

y) b[x][y]=true;

dfs(x-1,y);

dfs(x+1,y);

dfs(x,y-1);

dfs(x,y+1);

b[x][y]=false;

}int main()

dfs(sx,sy);

printf("%d\n",ans);

return

0;}

這道題調了好久,用了好多不同的方法來寫,結果反正就是那些小問題。最近發現我調題都可以調好久,估計又fuzao了。

#include

using

namespace

std;

int n,ans,a[100],b[100][100];

inline

int read()

void dfs(int x,int y)

return;

}for (int i=1;i<=n;++i)

if (b[x+1][i]==0)

dfs(x+1,i);

for (int j=x+2;j<=n;++j)

}}int main()

bfs八個方向。發現bfs的板子都差不多:首先,該進隊的都進隊。然後,取隊頭,向幾個方向都遍歷一次。如果符合要求,該點進隊,ans陣列更新。當然,這裡也需要開乙個b陣列來儲存當前點是否已經入過隊。

#include

using namespace std;

intm,n,m1,m2,a[35][35],sx,sy,fx,fy,ans[35][35];

int dx[10],dy[10];

bool b[35][35];

struct queue

q[1010];

inline int

read()

void bfs()

}}

}int main()

if (a[i][j]==4)

}dx[0]=-m1;dy[0]=-m2;

dx[1]=m1;dy[1]=-m2;

dx[2]=-m1;dy[2]=m2;

dx[3]=m1;dy[3]=m2;

dx[4]=-m2;dy[4]=-m1;

dx[5]=m2;dy[5]=-m1;

dx[6]=-m2;dy[6]=m1;

dx[7]=m2;dy[7]=m1;

bfs();

printf("%d\n",ans[fx][fy]);

return

0;}

廣搜和深搜

一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數 已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著若是...

深搜和廣搜

深度優先搜尋屬於圖演算法的一種,英文縮寫為dfs即depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次 採用的搜尋方法的特點是盡可能先對縱深方向進行搜尋。基本思路 深度優先遍歷圖的方法是,從圖中某頂點v出發 1 訪問頂點v 2 依...

深搜與廣搜

深搜是一種一條路走到黑,碰壁就倒退的演算法。運用遞迴思想,如果到了不符合條件的節點就撤回一步,然後再選擇另一條路走下去。如果這個節點的所有路徑都走完了,再撤回一步。最簡單的模板 int x 4 int y 4 上下左右四個方向走。也可以八個方向,這裡我就不寫了。void dfs int fx,int...