C++算法 廣搜


有一個同學推薦我寫一下廣搜,廣搜在最短路(騙分)上確實也有突出貢獻,普及組應該也會考到,我今天就給要考普及組的同學講講課,今天講廣搜。

廣搜,把可以走到的地點存進隊列,然后一個個走,所以他第一次走到一個點時的步數,一定是開始位置和這個點的最短步數,因為他會把所有路徑都加進去,所以第一次碰到的一定是最短路。因為這一點,廣搜在最短路比深搜強。 

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的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM