DFS 深度優化搜尋

2021-10-10 02:34:26 字數 1784 閱讀 4988

類似於樹的先根遍歷。就是不撞南牆不回頭

模板一:

dfs(dep,..)//dep代表目前dfs的深度

dfs(dep+1,..)//列舉下一種情況

}模板二:

dfs(dep,..)

}

1.從圖中v0出發,訪問v0。

2.找出v0的第乙個未被訪問的鄰接點,訪問該頂點。以該頂點為新頂點,重複此步驟,直至剛訪問過的頂點沒有未被訪問的鄰接點為止。

3.返回前乙個訪問過的仍有未被訪問鄰接點的頂點,繼續訪問該頂點的下乙個未被訪問領接點。

4.重複2,3步驟,直至所有頂點均被訪問,搜尋結束。

v0->v2->v4->v6->v1->v5->v3

已知乙個數n,將數字1~n圍成乙個圓環,要求: 相鄰兩個數之和為素數。0

輸出:

每次遞迴前判斷前兩個數之和是否為素數,因為是環,最後乙個數和第乙個數也要滿足

dfs前可以先用素數篩,求50內的素數,n最大20,最大的兩個素數和<50

#includeusing namespace std;

const int max=50;

int prime[25];//素數陣列

bool vis[25]; //訪問陣列

int n;// 個數

int ans[max];//解答輸出陣列

void prime_set() //篩法求素數

prime[1] = 0,vis[1]=true;//1雖然不是素數,但在此假設為0,將vis[1]設為true即不會遍歷到1

}void dfs(int depth)

return 1;

} void dfs(int x,int y)//x表示差幾個數,y表示選到a[y]

}}

int main()

,dy[4]=;//方向向量

for(int m=0;m<4;m++)

}matrix[i][j]=t;//回溯

return false;

}};

小明現在在玩乙個遊戲,迷宮是乙個n*m的矩陣。

小明的起點在地圖中用「s」來表示,終點用「e」來表示,障礙物用「#」來表示,空地用「.」來表示。

小明想要知道,現在他能否從起點走到終點

樣例輸入

3 3

s....e

...3 3

s#####

##e

樣例輸出
yes

no

ac**

#includeusing namespace std;

int n,m,flag=0,a,b;//flag是標記能否到達

const int max=510;

char s[max][max];

int dx=, dy=;//方向向量

void dfs(int i,int j)

s[i][j]='#';//走過了的路不回頭

for(int e=0; e<4; e++)

dfs(i+dx[e], j+dy[e]);//繼續深搜

}int main()

return 0;

}

最基礎的深度優化搜尋 dfs 題目

前幾天回看自己大一剛開學刷oj時遇到的一道迴圈類題目,結合這個假期自已學的一點點演算法知識,重新寫了段 也算是加深自己對dfs的理解了。題目描述 將1,2,9共9個數分成3組,分別組成3個三位數,且使這3個三位數構成1 2 3的比例,試求出所有滿足條件的3個三位數。從演算法層面上說 這是一道最基礎的...

深度優先搜尋DFS

作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...

深度優先搜尋 DFS

深度優先搜尋 縮寫dfs 有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v 0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。你可以跳過第二節先看第三節,還是引用上篇文章的樣例...