深度優先搜尋(入門詳解) DFS

2021-09-27 22:12:05 字數 2103 閱讀 9939

深度優先搜尋過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次,就是找到與某個節點相關聯的所有情況,從中找出最優解。

以乙個例子來講解這種演算法的基本思路

描述

1   2   3   4   5   6   7  

#############################

1 # | # | # | | #

#####---#####---#---#####---#

2 # # | # # # # #

#---#####---#####---#####---#

3 # | | # # # # #

#---#########---#####---#---#

4 # # | | | | # #

#############################

(圖 1)

# = wall

| = no wall

- = no wall

圖1是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間(相通的所有方塊為乙個房間),最大的房間有多大。城堡被分割成mn(m≤50,n≤50)個方塊,每個方塊可以有0~4面牆。

輸入

程式從標準輸入裝置讀入資料。第一行是兩個整數,分別是南北向、東西向的方塊數。在接下來的輸入行裡,每個方塊用乙個數字(0≤p≤50)描述。用乙個數字表示方塊周圍的牆,1表示西牆,2表示北牆,4表示東牆,8表示南牆。每個方塊用代表其周圍牆的數字之和表示。城堡的內牆被計算兩次,方塊(1,1)的南牆同時也是方塊(2,1)的北牆。輸入的資料保證城堡至少有兩個房間。

輸出城堡的房間數、城堡中最大房間所包括的方塊數。結果顯示在標準輸出裝置上。

樣例輸入

4 

7 11 6 11 6 3 10 6

7 9 6 13 5 15 5

1 10 12 7 13 7 5

13 11 10 8 10 12 13

樣例輸出

5

9

要想找到乙個房間,就要遍歷與這個房間相關聯的每乙個方塊,假如方塊1與方塊2相同,方塊2與方塊3、方塊4相同,方塊1、2、3、4構成乙份房間,那我們就要遍歷每乙個方塊以求出房間大小。在遍歷的時候還要標記當前方塊,以便當前方塊再次被遍歷。

**(有詳細解釋)

#include#includeusing namespace std;

int r, c; //行數和列數

int color[60][60]; //用來標記當前房間是否訪問過

int room[60][60];

int maxroomarea = 0; //用來記錄面積最大的房間

int roomnumber = 0; //房間數量

int roomarea; //用來記錄房間的面積

void dfs(int i, int k)

roomarea++; //房間的面積

color[i][k] = roomnumber; //標記當前結點,防止再次遍歷該節點

//選擇與當前結點相關聯的另乙個節點,繼續dfs

if ((room[i][k] & 1) == 0)dfs(i, k - 1); //向西

if ((room[i][k] & 2) == 0)dfs(i - 1, k); //向北

if ((room[i][k] & 4) == 0)dfs(i, k + 1); //向東

if ((room[i][k] & 8) == 0)dfs(i + 1, k); //向南 }

int main()

} memset(color, 0, sizeof(color)); //初始化

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

} }cout << roomnumber << endl;

cout << maxroomarea << endl;

system("pause");

return 0;

}

演算法入門 深度優先搜尋 DFS

深度優先搜尋 dfs 演算法入門 郭志偉 sysu raphealguo at qq.com 2012 05 12 深度優先搜尋 縮寫dfs 有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後...

深度優先搜尋DFS

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

深度優先搜尋 DFS

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