C# 广度优先遍历(BFS)算法实现

定义

在这里插入图片描述
【假设先访问左子树在访问右子树】
那么广度遍历的顺序就是ABCDEF
从上到下,从左到右去访问
运用到格子游戏中,找寻某点到某点的路径
【假设只记录四方位(遍历顺序上左下右)】
向队列中存入起点,遍历该点周围的点,边界看做障碍,遍历到结束点返回
注意需要把该点设置为已访问过的【防止重复访问导致死循环】
当然障碍也是不访问的。最后把符合要求的放入队列中
遍历完该点四周,就移除该点,继续遍历队列中的点。
在这里插入图片描述

次数队列中元素
11
21 ,2,11
31,2, 11,3
41,2,11, 3,21
51,2,11,3, 21 ,4
51,2,11,3,21 ,4,22
61,2,11,3,21 ,4, 22,14
71,2,11,3,21 ,4,22, 14,32,23

结束。

代码

public IEnumerator PutPosToPath(int target,int end)
{
    yield return null;
    //广度遍历所需【起点,终点,队列】
    Queue<int> path=new Queue<int>();
    //判断终点对应的格子是否能通过
    if(PosDicLabyrinth[end-1].GetComponent<GridType>().IsObs)
    {
       Debug.Log("终点是障碍");
       isOk=false;
       yield break;
    }
    //一口气算出路径/
    
    //进队
    int front=path.Peek();
    //设置该点为已访问
    ChangeVisited(target,true);
    //如果path队列不为空【如果找不到,就遍历所有能遍历的点的意思】
    while(path.Count!=0)
    {
         //取对头
         path.Euqueue(target);
       //设为已浏览过的
         ChangeVisited(target,true);
         //如果对头等于end,就返回
         if(front==end)
         {
             isOk=true;
             yield break;
         }
         //得到该点四周的点的id值
         int[] s=PosDicLabyrinth[front-1].GetComponent<GridType>().GirdGroud;
         //遍历
         for(int i=0;i<s.Length;i++)
         {
            if(!IsObsORVisited(s[i]))//如果该点没有访问过而且不是障碍
            {
               path.Enqueue(s[i]);//加入队列中
               ChangeBefore(s[i],front);//改变其父值
               ChangeVisited(s[i],true);//设为已访问
               if(s[i]==end)
               {
                  isOk=true;
                  yield break;
               }
             }
         }
         isOk=false;
   }


             
     


效果

在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值