广度优先算法(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; // 得到的路径
},
上一篇: 广度优先算法
下一篇: Python的多重继承问题