最簡單的搜尋演算法

2021-09-16 14:31:44 字數 2537 閱讀 8074

目前自己用的比較多的是廣搜bfs

以下是別的大神們的詳細講解:

原**:

bfs可用於解決2類問題:

從a出發是否存在到達b的路徑;

從a出發到達b的最短路徑(這個應該叫最少步驟合理);

其思路為從圖上乙個節點出發,訪問先訪問其直接相連的子節點,若子節點不符合,再問其子節點的子節點,按級別順序依次訪問,直到訪問到目標節點。

所謂的"圖"為:

案例

如上圖所示,找出從a到h的最短路徑(步驟最少的,假設每一段距離相等),此時就可以使用廣域搜尋演算法,原理步驟為:

過濾已經搜尋過的節點

對於已經搜尋過的節點,最好將其唯一的id標識儲存下來,後續搜尋過程中如果再次出現該節點則跳過不再重複搜尋,以提高效率和避免死迴圈;

舉個例子

imustacm 2025

題目描述

小明聽說機場是乙個很肥的地方,所以想跳一波機場,看看到底有多肥。不過機場雖然肥,但是跳的人也多。小明第一次跳機場,剛跳下來就到處都是槍聲,小明嚇得快要哭出來了,想逃離機場,emmm,還是打野比較適合他。

現在把機場看作乙個二維平面,』.』代表可以走的空地,』@』代表小明當前的位置,』x』代表這裡是個障礙物,』o』代表這裡有個敵人,並且手裡有槍,敵人可以攻擊上下左右四個方向,小明只要走到或者一開始就在敵人可以攻擊的位置,就會死亡(機場個個都是98k爆頭dalao),子彈不會穿過障礙物,敵人不會移動。小明只能往上下左右走,每走一步需要1秒,只要小明移動到機場的邊緣再走一步就算逃離了機場,現在小明請你幫他找一條最快逃離機場的線路,輸出這個時間,如果怎麼都逃不出去,輸出「no zuo no die!」(不含引號)。

輸入多組測試資料,首先第一行乙個整數t,代表測試資料組數。1 ≤ t ≤ 100。

每組測試資料有n,m(1 ≤ n,m ≤ 200),代表機場是乙個n×m的方陣,接下來是乙個由』.』,』@』,』x』,』o』 構成的n×m的方陣,』@』只有乙個。

輸出對於每組資料輸出乙個數代表最快需要多少時間逃出機場,或者「no zuo no die!」。

樣例輸入

35 5

.x.x.

.x.x.

……@…

.o.o.

3 3@…

***o.x

3 3o.o

[email protected].

樣例輸出41

no zuo no die!

解題思路:既然士兵o可以狙擊,那我們直接把他可以狙擊的地方都定義成

'!'表示這是他可以狙擊到的地方,為什麼不定義成牆壁』x』呢?剛開始我就是定義成這個的,結果浪費了我好多時間,一直wa(痛哭)。因為把狙擊的地方定義成牆壁就無法判斷原本真正的牆壁!(因為題目所言子彈是無法穿過牆壁的,寫的時候如果把假牆壁判斷了就不能穿過了~)

解題**:

#include #include #include #include #include #include #include #include #include #include using namespace std;

char maps[300][300];

int mark[300][300];

int dir[4][2] = ,,, };

int n, m;

struct node

};bool mark1 = true;

void letgo(int x,int y)

if(maps[x1][y1] == '.')

maps[x1][y1] = '!';//都沒發現異常,就直接定義成狙擊路徑啦}}

}int bfs(int x,int y)

); mark[x][y] = 0;

while(!ming.empty())

);//沒發現異常就步數+1

mark[x1][y1] = 0;}}

}return -1;

}int main()}}

for(int k = 0;k < n;k++)}}

if(!mark1)

break;

}if(!mark1)

continue;

int i = bfs(x,y);

if(i != -1)

cout << i << endl;

else

cout << "no zuo no die!" << endl;

}return 0;

}

搜尋演算法 DFS BFS(簡單介紹)

一般步驟 1 把初始狀態放入陣列中,設為當前狀態 2 擴充套件當前的狀態,產生乙個新的狀態放入陣列中,同時把新產生的狀態設為當前狀態 3 判斷當前狀態是否和前面的重複,如果重複則回到上乙個狀態,產生它的另一狀態 4 判斷當前狀態是否為目標狀態,如果是目標,則找到乙個解答,結束演算法。5 如果陣列為空...

A 搜尋演算法

啟發式搜尋演算法 要理解 a 搜尋演算法,還得從啟發式搜尋演算法開始談起。所謂啟發式搜尋,就在於當前搜尋結點往下選擇下一步結點時,可以通過乙個啟發函式 來進行選擇,選擇代價最少的結點作為下一步搜尋結點而跳轉其上 遇到有乙個以上代價最 少的結點,不妨選距離當前搜尋點最近一次展開的搜尋點進行下一步搜尋 ...

A 搜尋演算法

a 演算法是基於bfs的一種入門級啟發式搜尋演算法,就是將bfs的佇列改為基於估價的優先佇列,可以快速地找到答案。優先隊列為小根堆 while 優先佇列不為空 取出隊頭並擴充套件 將擴充套件節點以估價值 當前值為優先順序入隊 endwhile估價函式越接近真實值演算法越優,但一定不能大於真實值,否則...