ACM學習歷程29 搜尋演算法

2021-07-23 03:55:10 字數 2127 閱讀 4336

搜尋演算法是利用計算機的高效能來有目的地窮舉乙個問題的部分或所有的可能情況,從而求出問題的解的一種方法。搜尋過程實際上是根據初始條件和擴充套件規則構造一棵解答樹並尋找符合目標狀態的節點的過程。涉及到的概念包括:狀態、狀態轉移、搜尋樹、狀態空間、可行解、最優解。

一、相關概念

狀態:對問題以及事物狀態在某一發展階段的數學描述。

狀態轉移:問題從一種狀態轉移到另一種狀態的操作。

搜尋樹:以階段中每乙個狀態作為乙個點,狀態之間的轉移作為邊,形成乙個隱式圖。

其中我們把初始狀態看做根。那麼我們的搜尋過程實際上就是在對這個樹的結點做遍歷。這棵樹也可以稱為狀態空間。

二、搜尋演算法分類

列舉演算法:最直接的搜尋方法,列舉問題的所有狀態

.然後從中找出問題的解。

廣度優先搜尋(bfs):從初始狀態開始,通過規則來生成第一層結點

,同時檢查生成結點中是否有目標結點

.若沒有則生成下一層接點

,並檢查是否有目標結點。廣度優先搜尋通常採用佇列儲存,每次擴充套件時都會擴充套件當前結點的所有子結點。

深度優先搜尋(dfs):從初始結點開始擴充套件,按照某中順序不斷的向下擴充套件

,直到找到目標狀態或者是無法繼續擴充套件。深度優先搜尋通常用到堆疊儲存,當前節點為下一次擴充套件結點的父節點。

雙向廣度優先搜尋

a*演算法

回溯演算法

三、簡單搜尋演算法舉例

3.1 油田合併

問題描述:某石油公司發現了乙個油田。該油田由n*m個單元組成的矩形,有些單元裡有石油,有些則沒有。單元油田可以通過上,下,左或右連通。在乙個單元油田裡架設一台採油機,它可以把和該單元油田相連的單元油田的石油採完。該公司想知道最少需要架設幾台採油機能把所有的石油採完。

輸入:輸入2個正整數n,

m(1<=n,m<=50)

。接著有

n行,每行有

m個字元。

'@'表示該單元有石油,

'*'則表示該單元沒有石油。

輸出:對於每組測試,輸出最少需要架設幾台採油機。

解答思路:(1)建立陣列,用來儲存油田分布狀態;(

2)建立陣列,用來儲存採油機安裝的狀態;(

3)某一點是否可以放採油機取決於,此地是否有油井,並且,此地的上和左,是否架設了油井,如果架設,本地不再需要,如若沒有,在本地放採油機;(

4)如果可以放採油機,我們就在原有採油機的基礎上再加1。

解答**:

#include#include#includeusing namespace std;

int dfs(int t,int j);

char data[51][51];//油田分布情況

int flag[51][51];//標記油田

int main()

else if(i-1<0 && j-1>=0)

else if(i-1>=0 && j-1<0)

return 1;

}

執行結果:

3.2 老鼠走迷宮:老鼠的走法有上、左、下、右四個方向,在每前進一格之後就選乙個方向前進,無法前進時退回選擇下乙個可前進方向,如此在陣列中依序測試四個方向,直到走到出口為止。

解答**:

ACM搜尋演算法總結

一 回溯演算法 回溯演算法是所有搜尋演算法中最為基本的一種演算法,其採用了一種 走不通就掉頭 思想作為其控制結構,其相當於採用了先根遍歷的方法來構造解答樹,可用於找解或所有解以及最優解。評價 回溯演算法對空間的消耗較少,當其與分枝定界法一起使用時,對於所求解在解答樹中層較深的問題 有較好的效果。但應...

acm搜尋演算法總結

近期也是學習了搜尋演算法,搜尋被稱為通用解法 雖然啥題都可以解但是也有很大的弊端就是時間!概念 狀態對問題在某一時刻進展情況的數學描述或者是數學抽象。狀態轉移 每乙個狀態都是乙個可能的解,狀態的轉移就是問題從乙個狀態轉移到另乙個狀態,這樣就可以進行搜尋的一步步延伸直到找到需要的解。廣度優先搜尋 一層...

ACM二分搜尋演算法

二分搜尋演算法就是把要搜尋的資料在搜尋文字中根據情況進行折半,比如要在2 6 4 9 3 8 7 3 5中找到找到4的位置,那麼可以考慮先把資料進行排序,然後把拍好後的資料的中間的那個資料和要查詢的資料4進行比較,如果中間的資料比4大,那麼4肯定在左半邊 即最小資料到中間資料這邊 既然這樣,那又在這...