深度優先搜素及題目

2021-10-02 11:56:29 字數 1618 閱讀 4611

1. 搜尋是指已知初始狀態和目標狀態,對問題的中間狀態進行列舉的遍歷的一種演算法,通俗的講,搜尋就是比較複雜的列舉。

2.深度優先搜尋是按照深度的方式進行搜尋,就是把所有可行的方案都列舉出來,不斷的去嘗試,直到找到問題的解。 設想你在乙個迷宮裡面,當我們在起點時,總要通過各種岔路口才能找到迷宮的終點,那麼從起點開始,沿著一條路向前走,當碰到岔路口時,選擇其中乙個岔路前進。如果選擇的這個岔路前方是一條死路,那麼就退回這個岔路口,選擇另乙個岔路前進。如果岔路口存在新的岔路口,那麼就按上述方法再次執行,這樣的話,我們便可以找到終點。

也就是說,當碰到岔路口時,總是以「深度」作為前進的關鍵,不碰到死胡同就不回頭

那麼,碰到死胡同後返回上個岔路口的這種方法稱之為——回溯法

例:數字的全排列:即123的全排列是123,132,213,231,312,321。即用1,2,3這三種數字組成乙個3位數,且不允許出現重複的數字。

即如圖所示,我們人為規定,1,2,3的選擇方法是先選擇1,再選2,最後選3。那麼我們如果要進行全排列,便如圖所示。

我們規定放第乙個數字的是第乙個盒子…以此類推,將數字放入盒子的**:

void

dfs(

int step)

}return

;}

那麼結束的標準是什麼呢,即當我們處理到第n+1個小盒子時,說明前面的n個盒子已經放好了,那麼我們變將這種情況輸出。即:

if

(step==n+1)

完整**如下:

#include

int a[10]

,book[10]

,n;void

dfs(

int step)

for(i=

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

return;}

intmain()

即我們用乙個二維陣列來儲存這個迷宮,迷宮為n*m的大小,終點的座標為(p,q),尋找從起點到終點的最短路徑,我們規定順序為向右走,向下,向左,向上。儲存迷宮的二維陣列中0代表可以走的路,1代表障礙物。

**如下:

#include

int n,m,p,q,min=

1000000

;int a[20]

[20],book[20]

[20];

void

dfs(

int x,

int y,

int step)

//x,y為當前點的橫縱座標,step表示已經走過的步數。,,

};//分別為向右走,向下,向左,向上

int tx,ty,k;

//tx,ty為下乙個點的橫縱座標

if(x==p&&y==q)

//判斷是否到達終點

for(k=

0;k<=

3;k++)}

return;}

intmain()

4 17部落格(廣度優先搜尋和深度優先搜素)

這週講了搜尋演算法。相比於單純的列舉演算法有了一定的方向性和目標性。演算法是在解的空間裡,從乙個狀態轉移 按照要求拓展 到其他狀態,這樣進行下去,將解的空間中的狀態遍歷,找到答案 目標的狀態 搜尋演算法分為廣度優先搜尋 bfs 和深度優先搜尋 dfs 廣度優先搜尋 基本思想 從初始狀態 s 開始,利...

c語言 dfs n皇后問題 深度優先搜素

c語言dfs基礎入門題目 n皇后問題 n 皇后問題是指將 n 個皇后放在 n n 的西洋棋棋盤上,使得皇后不能相互攻擊到,即任意兩個皇后都不能處於同一行 同一列或同一斜線上。現在給定整數n,請你輸出所有的滿足條件的棋子擺法。輸入格式 共一行,包含整數n。輸出格式 每個解決方案佔n行,每行輸出乙個長度...

BFS廣度優先搜素

bfs相對於dfs來說,並不是一條路走到黑,不撞南牆不回頭,而是對於每一層的所有情況都遍歷一次才進入下一層。也就是說bfs更側重於每一層的可能性,而不是每個選擇的可能性。對於二叉樹的遍歷來說,遍歷完一層才會進入下一層。c 中實現方法往往是使用乙個佇列,先將起點元素push進去,然後再去遍歷該元素的子...