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

  

 加一幅图:

C++算法 广搜

从红色走到蓝色,黑色不能走。

每个格子上的数字表示最少要几步。

C++算法 广搜

广搜难的部分就是上面这些,剩下的都是输入输出。大家应该会写。我给你们推荐一道题目 https://www.luogu.com.cn/problem/P1162 洛谷的填涂颜色。是一个一般的广搜,相信大家一定可以AC的。

原文链接: https://www.cnblogs.com/lichangjian/p/12369544.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++算法 广搜

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/331894

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午6:15
下一篇 2023年3月1日 下午6:16

相关推荐