有一个同窗推荐我写一下广搜,广搜在最短路(骗分)上确实也有突出贡献,普及组应该也会考到,我今天就给要考普及组的同窗讲讲课,今天讲广搜。数组
广搜,把能够走到的地点存进队列,而后一个个走,因此他第一次走到一个点时的步数,必定是开始位置和这个点的最短步数,由于他会把全部路径都加进去,因此第一次碰到的必定是最短路。由于这一点,广搜在最短路比深搜强。 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