我的深度搜尋和廣度搜尋的學習 題目記錄

2021-09-12 08:36:32 字數 3814 閱讀 9299

1.數字的全排列

#include #include #include using namespace std;

int a[10];//這個陣列中乙個乙個放排的

int flag[10];//這個陣列標記數字是否放入

int n;

void dfs(int step)

備註:乙個陣列進行標記,另乙個陣列進行放置的排列,一次排好以後輸出排列結果;倒退回最近的一步進行選擇再次進行排列。

2.二維陣列尋找最少步數(走出迷宮最短步數)

(下標從1開始)

0 0 1 0

0 0 0 0

0 0 1 0

0 1 0 0

0 0 0 1

這樣的乙個5*4的矩陣,1代表路障,0可以走,從(1,1)出發,到(4,3)的位置

#include #include #include using namespace std;

int map[6][5];

int mins=999999;

bool flag[6][5]=;

void dfs(int r,int c,int step),,,};

if(r==4&&c==3)

} return;

}int main()

cout備註:與第一題不同在於 1,變成二維陣列,需要開設兩個二維陣列,乙個進行標記,另乙個進行排列;2,有步數的加入,每一次遞迴都加一次步數,到達終點時將步數與之前步數進行比較,輸出最小步數;3,分方向,迴圈的條件變為現在所在位置的四個方向的選擇。 

3.求島嶼的面積

在一張二維地圖中,數字代表海拔,0代表大海,求某乙個點(比如6,8)所在島嶼的面積

#include #include #include using namespace std;

int sum;

int x,y;

int map[11][11]=;

bool flag[11][11]=;

void dfs(int r,int c),,,};

int tr=0,tc=0;

for(int i=0;i<4;i++)

} return;

}int main();

bool flag[11][11]=;

void dfs(int r,int c,int n),,,};

int tr=0,tc=0;

map[r][c]=n;

for(int i=0;i<4;i++)

} return;

}int main()

} }cout<

}

備註: 從左上角開始遍歷尋找,找到乙個島將它置於num--(並深度搜尋與該島嶼相連的所有島都置於該num--),相當於劃分板塊,-1,-2,-3...板塊,最後乙個板塊的負即為島嶼的個數了。

5.方格填數

如下的10個格仔

填入0~9的數字。要求:連續的兩個數字不能相鄰。

(左右、上下、對角都算相鄰)

一共有多少種可能的填數方案?

//第一排檢查左右,第一列檢查上和右上,第三列檢查上,上左,左,其餘檢查左,上左,上,上右;

void dfs(int r,int c)

for(int i=0;i<10;i++)

}} int main()

dfs(0,1);

cout<6.寒假作業

每個方塊代表1~13中的某乙個數字,但不能重複。

比如:6  + 7 = 13

9  - 8 = 1

3  * 4 = 12

10 / 2 = 5

以及: 

7  + 6 = 13

9  - 8 = 1

3  * 4 = 12

10 / 2 = 5

就算兩種解法。(加法,乘法交換律後算不同的方案)

// for(int i=0;i這兩個部落格寫的很好,我看得第乙個文章介紹,做的第二個題目。

演算法入門

深度優先的八個簡單小栗子

1.在乙個n*m(n行, m列)的迷宮中,存在著乙個入口、一些牆壁以及乙個寶藏。由於迷宮是四連通的,即在迷宮中的乙個位置,只能走到與它直接相鄰的其他四個位置(上、下、左、右)。現洪尼瑪在迷宮的入口處,問他最少需要走幾步才能拿到寶藏?若永遠無法拿到寶藏,則輸出-1。

輸入樣例1:

3 3s.#

.#e輸出 -1

輸入樣例2:

5 5s.#..

#...e

輸出 7

#include #include #include #include #define max 101

using namespace std;

char map[max][max];

bool vis[max][max]=;//標記是否已經訪問

struct point

};int next[4][2]=;

int flag,val,num=0;

int n,m;

queueq;//用賭佇列進行維護

void bfs(int sr,int sc)

for(int i=0;i<4;i++)

} }}int main()

for(int i=0;i

} }

bfs(r1,c1);

if(flag==0) cout<

else cout<

return 0;

}

深度搜尋和廣度搜尋

這篇部落格很早之前就寫好了,但是一直沒有發出來。在進行詳細解說之前,我們需要先借用圖的概念,圖就是由一些小圓點 稱為頂點 和連線這些小圓點的直線 稱為邊 組成的。如下圖是由5個頂點 1,2,3,4,5 和5 條邊 1 2,1 2,1 4,2 5,3 4 組成的。現在我們從一號頂點開始遍歷這個圖,使用...

廣度搜尋和深度搜尋

我現在要從 雙子峰 前往 金門大橋 求最短的路徑 帶單獨參構造方法 public placetree string p 帶全參的構造方法 public placetree placetree left,placetree right,string p public static void main ...

廣度搜尋和深度搜尋的分析

廣度優先搜尋和深度優先搜尋各有他的優點,也有他們的不足之處。廣度優先搜尋在遍歷的時候不需要全部遍歷,搜尋到符合條件的就立即終止,這樣就不會浪費太多時間。但是在遍歷的過程中,他需要建立乙個佇列來儲存遍歷的狀態 也就是遍歷到的每乙個結點需要先存入到佇列中,然後取出 這樣就無非就增加了空間複雜度。而深度優...