有一個同學推薦我寫一下廣搜,廣搜在最短路(騙分)上確實也有突出貢獻,普及組應該也會考到,我今天就給要考普及組的同學講講課,今天講廣搜。
廣搜,把可以走到的地點存進隊列,然后一個個走,所以他第一次走到一個點時的步數,一定是開始位置和這個點的最短步數,因為他會把所有路徑都加進去,所以第一次碰到的一定是最短路。因為這一點,廣搜在最短路比深搜強。
a1[5]={0,0,1,-1};//控制4面移動的數組,不明白的話可以畫個圖,算算坐標。
a2[5]={1,-1,0,0};
void bfs()
{
t=0;//t,w分別代表隊列的頭和尾。
w=0;
ma[t].x=開始的x;//ma是這個隊列。其實用queue也可以
ma[t].y=開始的y;//ma的大小要和矩陣的大小一致,因為有可能全部相連。
t++;//2種情況,到達終點和不可能到達終點。
while(w<t)//在隊列有元素的時候運行,沒有元素代表所有和起點聯通的位置都被標記。
{
if(到達目標)//因為目標會隨着題目的變換而變換,所以寫個偽代碼也不過分。
{
結束
}
for(int i=0;i<4;i++)
{
zx=ma[w].x+a1[i];
zy=ma[w].y+a2[i];//計算出移動后的位置。
if(zx<=n&&zx>0&&zy<=n&&zy>0&&a[zx][zy]==0)//判斷是否出局和有沒有來過。
{
a[zx][zy]=3;//標記
ma[t].x=zx;//繼續插入隊列
ma[t].y=zy;
t++;
}
}
w++;//查看隊列中的下一個。
}
}
加一幅圖:

從紅色走到藍色,黑色不能走。
每個格子上的數字表示最少要幾步。

廣搜難的部分就是上面這些,剩下的都是輸入輸出。大家應該會寫。我給你們推薦一道題目 https://www.luogu.com.cn/problem/P1162 洛谷的填塗顏色。是一個一般的廣搜,相信大家一定可以AC的。
