利用深度優先搜尋(dfs)來解決迷宮問題

2021-10-02 23:50:08 字數 2608 閱讀 2167

(1)從圖中某個初始頂點v出發,首先訪問初始頂點v。

(2)然後依次從v的未被訪問的鄰接點w,再從w出發進行深度優先遍歷,直到圖中所有與v有路徑相通的的頂點都被訪問過為止。

解決問題:

(1)如何確定乙個頂點是否訪問過?

設定乙個visited全域性陣列,

visited[i]=0表示頂點i沒有訪問;

visited[i]=1表示頂點i已經訪問過。

(在圖中也可以修改圖本身來實現)

void

dfs(

int s)

嘗試每一種可能 }

}

(1)問題描述:

在乙個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。

(2)輸入:

輸入含有多組測試資料。

每組資料的第一行是兩個正整數,n k,用乙個空格隔開,表示了將在乙個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n

當為-1 -1時表示輸入結束。

隨後的n行描述了棋盤的形狀:每行有n個字元,其中 # 表示棋盤區域, . 表示空白區域(資料保證不出現多餘的空白行或者空白列)。

(3)輸出:

對於每一組資料,給出一行輸出,輸出擺放的方案數目c (資料保證c<2^31)。

(4)樣例輸入:

2 1

#..#

4 4…#

…#..#…

#…-1 -1

(5)樣例輸出

2

1

#include

#include

int n,k;

char map[10]

[10];

int sum;

int visited[10]

;void

dfs(

int y,

int t)

//滿足條件,次數加1,返回;

if(y<=n)

dfs(y+

1,t)

;//一直呼叫到最後一行,從最後一行開始,

//考慮到每一種情況;

for(

int i=

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

}int

main()

return0;

}

//用dfs來計算最短路徑

#include

int r,c,num=

10000

;char map[41]

[41];

int dx=

;int dy=

;void

dfs(

int x,

int y,

int k)

}for

(int i=

0;i<

4;i++)}

}int

main()

} map[1]

[1]=

'#';

dfs(1,

1,1)

;printf

("%d"

,num)

;}

//dfs遍歷是否能夠從(ha,la)到(hb,lb)

#include

#include

int dx=

;int dy=

;int n,ha,la,hb,lb,nx,ny;

bool flag;

char map[

200]

[200];

void

dfs(

int x,

int y)

else

dfs(nx,ny);}

}}intmain()

scanf

("%d%d%d%d"

,&ha,

&la,

&hb,

&lb);if

(map[ha]

[la]

=='#'

||map[hb]

[lb]

=='#'

)elseif(

!flag)

printf

("no\n");

}return0;

}

//棋盤問題**

#include

#include

int n,k;

char map[10]

[10];

int sum;

int visited[10]

;void

dfs(

int y,

int t)

if(y<=n)

dfs(y+

1,t)

;for

(int i=

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

}int

main()

return0;

}

深度優先搜尋DFS

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

深度優先搜尋 DFS

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

深度優先搜尋(dfs)

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