DFS 簡單描述

2021-10-23 12:56:22 字數 2611 閱讀 3317

深度優先遍歷圖的方法是,從圖中某頂點v出發:

(1)訪問頂點v;

(2)依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷;直至圖中和v有路徑相通的頂點都被訪問;

(3)若此時圖中尚有頂點未被訪問,則從乙個未被訪問的頂點出發,重新進行深度優先遍歷,直到圖中所有頂點均被訪問過為止。 

當然,當人們剛剛掌握深度優先搜尋的時候常常用它來走迷宮.事實上我們還有別的方法,那就是廣度優先搜尋(bfs).

就是找跟(最深處)一直往下,如果走不通的話就回溯至上一層,然後再往下查詢。

主體思路差不多,主要是輸出和計數需要根據不同情況修改一下哦,注:dfs會把所有情況都走一遍,所以在走的過程中,考慮計數會很麻煩。

eg:八皇后問題:

題目描述:

八皇后問題是乙個以西洋棋為背景的問題:如何能夠在 8×8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題:這時棋盤的大小變為n×n,而皇后個數也變成n。

#include

#include

#include

using

namespace std;

int hang[11]

, n=8;

int a[10]

[10]=

;int t =1;

void

print()

printf

("\n");

}}bool

judge

(int num)

void

dfs(

int num)

for(

int i =

1; i <=

8; i++)}

}int

main()

主要考慮越界,還有就是判斷函式,不能行相同,列相同,對角線相同,之後就是進行dfs即可。

eg:迷宮問題:

題目描述:

從s到t,.意味著可以走,*意味著不能走,如果能走,輸出路徑,如果不能走,輸出no。

輸入:

5 6

…s*

.*….….

.**.

.t…

輸出:

…m*

.**mm

.…*m

*.***m

.tmmmm

#include

#include

using

namespace std;

int n, m;

string maze[

110]

;//或者設定乙個二維陣列進行迴圈輸入,輸出

bool vis[

110]

[110];

//看該位置是否被訪問過,是標1,否0

int dir[4]

[2]=

,,,}

;//分別是不同方向

boolin(

int x,

int y)

bool

dfs(

int x,

int y)

vis[x]

[y]=1;

maze[x]

[y]=

'm';

//走過標為m(地圖上)

for(

int i=

0;i<4;

++i)}}

vis[x]

[y]=0;

maze[x]

[y]=

'.';

return

false;}

intmain()

int x, y;

for(

int i =

0; i < n; i++)}

}if(dfs

(x, y))}

else

return0;

}

同理,如果需要統計有多少條路徑,只需要在dfs函式中進行修改即可。

偽**:

int sum =0;

sum +

=dfs

(x -

1, y)

;//向左走

sum +

=dfs

(x +

1, y)

;//向右走

sum +

=dfs

(x, y -1)

;//向上走

sum +

=dfs

(x, y +1)

;//向下走

vis[x]

[y]=0;

//該點還原為沒有走過

return sum;

簡單原理描述

之所以是電動懸浮,是因為用於切割導體使之感應出電流的磁場是有通有交流電的線圈產生,導體在此磁場下,導體與磁場有相對的位移,這時候就會在導體產生環形感應電流進而產生乙個與原磁場方向相反的磁場,磁性相反體現出斥力。其本質就是將乙個旋轉電機沿著軸向將其切開展平。乙個單元的直線電機有三個相位差120 的交流...

Linq to object簡單描述

學習linq to object時,經常會遇到linq to object問題,這裡將介紹xx問題的解決方法。普通儲存過程,首先在查詢分析器執行下面的 來建立乙個儲存過程 create proc sp singleresultset asset nocount on select from cust...

iterator簡單描述

item 26.prefer iterator to const iterator,reverse iterator,and const reverse iterator.上面一段話,是 effective stl 中的一節。我在下面簡單摘抄了一下 我之所以要將上述貼在這裡,是因為,我在實際運用中,...