有一個同窗推薦我寫一下廣搜,廣搜在最短路(騙分)上確實也有突出貢獻,普及組應該也會考到,我今天就給要考普及組的同窗講講課,今天講廣搜。數組
廣搜,把能夠走到的地點存進隊列,而後一個個走,因此他第一次走到一個點時的步數,必定是開始位置和這個點的最短步數,由於他會把全部路徑都加進去,因此第一次碰到的必定是最短路。由於這一點,廣搜在最短路比深搜強。 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