欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

广度优先算法(BFS)

程序员文章站 2022-05-21 11:21:53
...

广度优先算法(BFS)的一般框架如下:

void BFS()
{
队列初始化;
初始节点入队;
while(队列非空)
{
队头元素出队,赋给current;
while(current还可以扩展)
{
由结点current扩展出新节点new;
if(new 重复已有的结点状态) continue;
new结点入队;
if(new结点是目标状态)
{
置flag = true; break;
}
}
}
}

对于不同的问题运用广度优先搜索基本上是一致的,但是对于具体的问题有着不同的表达方式,所以这些函数需要根据具体的问题进行实际上的编写。

下面是我项目中的一个具体的实现

  // 广度搜索

doSearch(curID) {
    let findList = [curID];  // 真实数组    即为队列初始化
    let que = [curID];  // 类似广度搜索的启动器,确定起点   初始节点入队
    let direion = [-5, 5, -1, 1];   // 拿到周围四个方块的id
    while (que.length > 0) {  // 是否搜索完毕    队列非空
        let cur = que.shift();  // 把搜索的起点拿出来   队头元素出队,赋给cur
        for (let x of direion) {
            let nextID = cur + x;    // 周围四个方块的坐标   由结点扩展出新的结点
            if (Math.abs(x) == 1 && Math.ceil(cur / 5) != Math.ceil(nextID / 5)) {  // 不能跨行搜索
                continue;
            }
            if (nextID > 0 && nextID < 26) {    // 不能跨界搜索
                if (this.blockNode.children[cur - 1].m_Score == this.blockNode.children[nextID - 1].m_Score) {  // 搜索到分数相同    还可以继续搜索
                    if (findList.indexOf(nextID) == -1) {    // 所搜索的方块是否已经被搜索过了   没有重复已有的结点
                        findList.push(nextID);      // 该结点入队
                        que.push(nextID);   // 下一个方块为起点进行搜索
                    }
                }
            }
        }
    }
    return findList;    // 得到的路径
},
相关标签: 算法