目前自己用的比較多的是廣搜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
樣例輸出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估價函式越接近真實值演算法越優,但一定不能大於真實值,否則...