小談深度優先搜尋

2021-07-08 20:48:38 字數 3206 閱讀 5828

最近讀了一本演算法書,書中提到了深度優先演算法,於是我就整理了一下。

引入小題:

解決方案:這裡先使用最簡單最常用的窮舉法時行求解。(此**中的book陣列起到了標記的作用,可以參考桶裝法排序了解標記的好處和作用)

#include int main()

//將獲得的序列標記一下,方便判斷是否全為不一樣的數字

for(i = 1; i <= 9; i++)

//用於判斷是否為9個不同的數字

sum = 0;

for(i = 1; i <= 9; i++)

if(sum == 9 && a[1] * 100 + a[2] * 10 + a[3] + a[4] * 100 + a[5] * 10 + a[6] == a[7] * 100 + a[8] * 10 + a[9] )

}printf("共有%d個這樣的數\n", total / 2);

return 0;

}

初入dfs小題:給出n,組成n位的全排序。(1 <= n)解決方案:如果已知n的話,可以在程式裡面寫入n個for迴圈,來得出需要的結果,但是這個n是在程式執行時給出的,所以這裡需要用遞迴實現。

#include #include int *box, *book, n;

void dfs(int step)

printf("\n");

return; }

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

int main()

涉及演算法:

可以把dfs歸結為如下模型

void dfs(int step) 

}

重試第一題:可使用dfs演算法來編寫這個題,執行效率能提高10倍(當然,這個演算法效率也不高)。

#include #include int *box, *book, n = 9, total = 0;

void dfs(int step)

return; }

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

int main()

再來一題:有一天,小哈乙個去玩迷宮。但是方向感很不好的小哈很快就迷路了。小哼得知後便立即去解救無助的小哈。小哼當然是有備而來,已經弄清楚了迷宮地圖,現在小哼要以最快速度去解救小哈。問題就此開始了……

迷宮由n行m列的單元格組成,每個單元格要麼是空地,要麼是障礙物。你的任務是幫助小哼找到一條從迷宮的起點到小哈所在位置的最短路徑,注意障礙物是不能走的,當然也不能走到迷宮之外。n和m都小於等於100。

輸入格式:第一行有兩個數n m。n表示迷宮的行,m表示迷宮的列。接來下來n行m列為迷宮,0表示空地,1表示障礙物。最後一行4個數,前兩個數為迷宮入口的x和y座標。後兩個為小哈的x和y座標。

樣例:

#include #include #include int **map, **book, min = 999999;

int p, q, m, n; //終點

void dfs(int x, int y, int step), //右

, //下

, //左

//上};

//邊界條件

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

//遍歷條件(四個方向)

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

return;

}int main()

for(i = 0; i < n; i++)

for(j = 0; j < m; j++)

book[i][j] = 0;

for(i = 0; i < n; i++)

} scanf("%d %d %d %d", &startx, &starty, &p, &q);

startx--;

starty--;

p--;

q--;

book[startx][starty] = 1;

dfs(startx, starty, 0);

if(min == 999999)else

return 0;

}

可見此演算法效率並不高。

bfs演算法處理(明顯提高時間複雜度,但空間複雜度提公升):

#include struct  node;

int main(), book[101][101] = ,

next[4][2]=, //右

, //下

, //左

//上

}; struct node que[100000];

//接收初值

scanf("%d %d", &n, &m);

for(i = 1; i <= n; i++)

} scanf("%d %d %d %d", &startx, &starty, &p, &q);

que[tail].x = startx;

que[tail].y = starty;

que[tail].s = 0;

book[startx][starty] = 1;

tail ++;

while(head < tail)

if(a[tx][ty] == 0 && book[tx][ty] == 0)

}}

if(flag == 1) break;

head ++; }

if(flag == 1)else

return 0;

}

部落格名稱:王樂平部落格

深度優先搜尋的小探索

第一次寫部落格,還不清楚套路,請見諒。關於dfs我在洛谷上看到乙個模板,覺得挺好 int search int t else 深度優先搜尋在很多題目會涉及,這裡附上洛谷p1605迷宮 給定乙個nm方格的迷宮,迷宮裡有t處障礙,障礙處不可通過。給定起點座標和終點座標,問 每個方格最多經過1次,有多少種...

深度優先搜尋 廣度優先搜尋(解決小哈)

問題省略 思路 讓小哼往右邊走,直到走不通的時候再回到這裡,再去嘗試另乙個方向。規定乙個順序,按順時針方向來嘗試 即按照右 下 左 上的順序去嘗試 先 檢查小哼是否已經到達小哈的位置,如果沒有到達則找出下一步可以走的地方。為了解決這個問題,此處dfs 函式只需要維護3個引數,分別是x座標 y座標 以...

廣度優先搜尋 深度優先搜尋

前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...