深度優先搜尋(DFS)和廣度優先搜尋(BFS)

2021-10-21 11:55:15 字數 4931 閱讀 8276

排列數字

給定乙個整數n,將數字1~n排成一排,將會有很多種排列方法。

現在,請你按照字典序將所有的排列方法輸出。

輸入格式

共一行,包含乙個整數n。

輸出格式

按字典序輸出所有排列方案,每個方案佔一行。

資料範圍

1≤n≤7
輸入樣例:
3
輸出樣例:
1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

**樣例
#include

using

namespace std;

const

int n=10;

int n;

// 儲存排列方式

int path[n]

;// 標記當前數字是否可以使用

bool st[n]

;void

dfs(

int u)

// dfs

for(

int i=

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

}int

main()

n 皇后問題

n-皇后問題是指將 n 個皇后放在 n∗n 的西洋棋棋盤上,使得皇后不能相互攻擊到,即任意兩個皇后都不能處於同一行、同一列或同一斜線上。

現在給定整數n,請你輸出所有的滿足條件的棋子擺法。

輸入格式

共一行,包含整數n。

輸出格式

每個解決方案佔n行,每行輸出乙個長度為n的字串,用來表示完整的棋盤狀態。

其中」.」表示某乙個位置的方格狀態為空,」q」表示某乙個位置的方格上擺著皇后。

每個方案輸出完成後,輸出乙個空行。

注意:行末不能有多餘空格。

輸出方案的順序任意,只要不重複且沒有遺漏即可。

資料範圍

1≤n≤9
輸入樣例:
4
輸出樣例:
.q..

...q

q...

..q.

..q.

q...

...q

.q..

**樣例

按行列舉

#include

using

namespace std;

const

int n=20;

int n;

// 儲存結果

char path[n]

[n];

// 判斷每列或對角線是否已經已經存在皇后

bool a[n]

,b[n]

,c[n]

;void

dfs(

int u)

return;}

for(

int i=

0;i}int

main()

dfs(0)

;return0;

}

對角線的位置判斷y=x+i

i=y-x 可能為負數,加乙個偏移量 n i=y-x+n

y=-x+i

i=y+x

**樣例

按元素列舉

#include

using

namespace std;

const

int n=20;

int n;

char path[n]

[n];

bool a[n]

,b[n]

,c[n]

,d[n]

;// x 代表列 y 代表行 s 代表皇后個數

void

dfs(

int x,

int y,

int s)

if(x==n)

// 說明已經列舉完 n*n 個格仔

cout<

}return;}

// 不放皇后

dfs(x,y+

1,s)

;//放皇后 if(

!a[y]

&&!b[x]

&&!c[y+x]

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

intmain()

dfs(0,

0,0)

;return0;

}

廣度優先搜尋可以搜尋到最短路,第一次將全部距離為1的點搜到,二次將全部距離為2的點搜到…走迷宮給定乙個n*m的二維整數陣列,用來表示乙個迷宮,陣列中只包含0或1,其中0表示可以走的路,1表示不可通過的牆壁。

最初,有乙個人位於左上角(1, 1)處,已知該人每次可以向上、下、左、右任意乙個方向移動乙個位置。

請問,該人從左上角移動至右下角(n, m)處,至少需要移動多少次。

資料保證(1, 1)處和(n, m)處的數字為0,且一定至少存在一條通路。

輸入格式

第一行包含兩個整數n和m。

接下來n行,每行包含m個整數(0或1),表示完整的二維陣列迷宮。

輸出格式

輸出乙個整數,表示從左上角移動至右下角的最少移動次數。

資料範圍

1≤n,m≤100
輸入樣例:
5 5

0 1 0 0 0

0 1 0 1 0

0 0 0 0 0

0 1 1 1 0

0 0 0 1 0

輸出樣例:
8
**樣例
#include

#include

#include

using

namespace std;

const

int n=

110;

typedef pair<

int,

int> pii;

int n,m;

int g[n]

[n];

// 儲存圖

int d[n]

[n];

// 儲存每個點到起始點的距離

pii q[n*n]

,t;int

bfs();

memset

(d,-1,

sizeof d)

;// 初始化

d[0][

0]=0

;int dx=

,dy=

;// 向四個方向延伸,向量法

while

(hh<=tt)

;// 更當前新位置 }}

}return d[n-1]

[m-1];

}int

main()

cout<<

bfs(

)<

return0;

}

在乙個 3×3 的網格中,1∼8 這 8 個數字和乙個 x 恰好不重不漏地分布在這 3×3 的網格中。

例如:

1 2 3

x 4 6

7 5 8

在遊戲過程中,可以把 x 與其上、下、左、右四個方向之一的數字交換(如果存在)。

我們的目的是通過交換,使得網格變為如下排列(稱為正確排列):

1 2 3

4 5 6

7 8 x

例如,示例中圖形就可以通過讓 x 先後與右、下、右三個方向的數字交換成功得到正確排列。

交換過程如下:

1 2 3   1 2 3   1 2 3   1 2 3

x 4 6 4 x 6 4 5 6 4 5 6

7 5 8 7 5 8 7 x 8 7 8 x

現在,給你乙個初始網格,請你求出得到正確排列至少需要進行多少次交換。

輸入格式

輸入佔一行,將 3×3 的初始網格描繪出來。

例如,如果初始網格如下所示:

1 2 3 

x 4 6

7 5 8

則輸入為:1 2 3 x 4 6 7 5 8輸出格式

輸出佔一行,包含乙個整數,表示最少交換次數。

如果不存在解決方案,則輸出 −1。

輸入樣例:

2  3  4  1  5  x  7  6  8
輸出樣例
19
**樣例
#include

#include

#include

#include

using

namespace std;

intbfs

(string start)

,dy=

;while

(!q.

empty()

)// 佇列不為空

swap

(t[a*

3+b]

,t[l]);

// 還原狀態 }}

}return-1

;// 隊列為空還沒有找到則說明找不到

}int

main()

cout<<

bfs(start)

<

return0;

}

深度優先搜尋(DFS)和廣度優先搜尋(BFS)

先說dfs 關於dfs和bfs的搜尋題目,首先要將其轉化為樹,如迷宮,也可轉化為樹來搜尋 dfs是一條鏈一條鏈的搜尋,而bfs是逐層進行搜尋,這是他倆乙個很大的區別 給定整數a1 a2 a3 an,判斷是否可以從中選出若干個數,使得他們的和恰好為k。限制條件 樣例 4 n 1 2 4 7 a陣列 1...

深度優先搜尋(DFS)和廣度優先搜尋(BFS)

深度優先搜尋和廣度優先搜尋都是圖形搜尋演算法,1 深度優先搜尋 是針對圖和樹的遍歷演算法,利用深度優先搜尋演算法可以產生目標圖的相應的拓撲排序表,利用拓撲排序表可以方便的解決了很多相關的圖論問題,如最大路徑問題,一般用堆資料結構來輔助實現dfs 演算法,其過程要來說是對每乙個可能的分支路徑深入到不能...

深度優先搜尋DFS和廣度優先搜尋BFS

注意 用遞迴 其實就是棧 和棧實現。有n個物品,沒見物品的重量為w i 價值為c i 現在需要選出若干件物品放入乙個容器為v的 揹包中,是的在選入揹包的物品重量和不超過容量v的前提下,讓揹包中物品的價值之和最大,求最大價值。void dfs int index,int sumw,int sumc d...