DFS深度優先搜尋(一定要想好搜素順序)

2021-10-24 18:21:58 字數 1723 閱讀 5017

#include

using

namespace std;

typedef

long

long ll;

const

int n=10;

int path[n]

;//用來存方案

int st[n]

;//用來檢查哪乙個數被用過

int n;

void

dfs(

int u)

for(

int i=

1;i<=n;i++)}

}int

main()

解法1:利用上題的思想進行列舉

#include

using

namespace std;

typedef

long

long ll;

const

int n =20;

int n;

char res[n]

[n];

bool col[n]

;//儲存用過哪一行,因為每一行只能有乙個皇后

bool dg[n]

;//儲存用過哪一條負對角線,在同一條對角線上時,橫座標 + 縱座標是乙個定值

bool udg[n]

;//儲存用過哪一條正對角線,在同一條對角線上時,橫座標 - 縱座標是乙個定值,但是陣列下標不能是乙個複數,所以需要加上偏移量n

void

dfs(

int u)

cout

for(

int i =

0; i < n; i++)}

}int

main()

解法2:最原始的方法,直接列舉每個格仔,每個格仔有兩種情況,放皇后或者不放皇后

#include

using

namespace std;

typedef

long

long ll;

const

int n =20;

int n;

char res[n]

[n];

bool row[n]

;//儲存用過哪一列

bool col[n]

;//儲存用過哪一行

bool dg[n]

;//儲存用過哪一條負對角線,在同一條對角線上時,橫座標 + 縱座標是乙個定值

bool udg[n]

;//儲存用過哪一條正對角線,在同一條對角線上時,橫座標 - 縱座標是乙個定值,但是陣列下標不能是乙個複數,所以需要加上偏移量n

void

dfs(

int x,

int y,

int s)

//x表示列,y表示行,s表示放了幾個皇后

cout << endl;

}return

;//不論如何都要回溯

}//對於每次列舉,只有兩種情況,放皇后和不放皇后

//不放皇后

dfs(x, y +

1, s)

;//放皇后if(

!row[x]

&&!col[y]

&&!dg[x + y]

&&!udg[x - y + n])}

intmain()

深度優先搜尋DFS

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

深度優先搜尋 DFS

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

深度優先搜尋(dfs)

深度優先搜尋的一般步驟 1 從頂點v出發,訪問v。2 找出剛才訪問過的頂點的第乙個未被訪問的鄰接點,訪問該頂點。以該頂點為新頂點,重複此步驟,直到剛訪問的頂點沒有沒有未被訪問過的鄰接點為止。3 返回前乙個訪問過的仍有未被訪問過的鄰接點的頂點,找出該頂點的下乙個未被訪問過的鄰接點,訪問該頂點。4 重複...