双向 BFS

模板(JavaScript)

let queue = [begin];
let map = new Map([end]);
let states = [state1, state2]; 
let step = 0;
while (queue.length && map.size) {
    // 选择元素个数少的,进行扩充
    if (queue.length > map.size) {
        [queue, map] = [Array.from(map), new Map(queue)];
    }

    // 路径长度增加
    step++;
    // queue 中的所有元素都处理一遍,生成新的 queue。
    let len = queue.length;
    while (len--) {
        const data = queue.shift();

        // 遍历所有生成的新值
        for (let val of process(states, data)) {
            // 有交集,返回距离
            if (map.has(val)) {
                return step;
            }
            // 值合法,加入队列
            if (isValid(val)) {
                queue.push(val);
            }
        }
    }
    
}

function* process(states, data) {
    for (let state of states) {
        yield _process(state, data);
    }
}

最后更新于