C++算法 廣搜

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

廣搜,把能夠走到的地點存進隊列,而後一個個走,因此他第一次走到一個點時的步數,必定是開始位置和這個點的最短步數,由於他會把全部路徑都加進去,因此第一次碰到的必定是最短路。由於這一點,廣搜在最短路比深搜強。 blog

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++;//查看隊列中的下一個。
	}
} 

  

 加一幅圖:隊列

從紅色走到藍色,黑色不能走。get

每一個格子上的數字表示最少要幾步。class

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

相關文章
相關標籤/搜索