SOURCE

// function stepsToKey(start, target, deadends) {
//     if(start == target) return 0

//     let queue = [start], queueReverse = [target]
//     let visited = [start,target];
//     let step = 0;

//     while(queue.length && queueReverse.length){
//         let qSz = queue.length
//         let currentQueue = [];
//         for (let i = 0; i < qSz; i ++) {
//             let currentKey = queue.shift()
//             console.log("currentKey = " + currentKey) 
//             if(queueReverse.indexOf(currentKey) > -1) { 
//                 return step
//             } 
//             if(deadends.indexOf(currentKey) > -1) {
//                 continue
//             }
//             for (let j = 0; j < currentKey.length; j ++) {
//                 let plus1 = key_plus1(currentKey, j)
//                 if (plus1 && visited.indexOf(plus1) == -1) {
//                     currentQueue.push(plus1)
//                 }
//                 let minus1 = key_minus1(currentKey, j)
//                 if (minus1 && visited.indexOf(minus1) == -1) {
//                     currentQueue.push(minus1)
//                 }
//             }
//         }
//         queue = queueReverse;
//         queueReverse = currentQueue;
//         step ++;
//     }

//     return -1;
// }

// function key_plus1 (key, plusIndex) {
//     if(typeof(key) != "string" || key.length <= plusIndex) return null;
//     let keyArr = key.split("");
//     if (keyArr[plusIndex] == 9) {
//         keyArr[plusIndex] = 0
//     } else {
//         keyArr[plusIndex] ++
//     }
//     return keyArr.join("")
// }

// function key_minus1 (key, plusIndex) {
//     if(typeof(key) != "string" || key.length <= plusIndex) return null;
//     let keyArr = key.split("");
//     if (keyArr[plusIndex] == 0) {
//         keyArr[plusIndex] = 9
//     } else {
//         keyArr[plusIndex] --
//     }
//     return keyArr.join("")
// }

// let steps = stepsToKey("0000", "1001", ["1010", "1110", "1111"])
// console.log(steps)


function stepsToKey(start, target, deadends) {
    if(start == target) return 0

    let queue = [start]
    let visited = [start];
    let step = 0;

    while(queue.length){
        let qSz = queue.length
        for (let i = 0; i < qSz; i ++) {
            let currentKey = queue.shift()
            console.log("currentKey = " + currentKey) 
            if(currentKey == target) { 
                return step
            } 
            if(deadends.indexOf(currentKey) > -1) {
                continue
            }
            for (let j = 0; j < currentKey.length; j ++) {
                let plus1 = key_plus1(currentKey, j)
                if (plus1 && visited.indexOf(plus1) == -1) {
                    queue.push(plus1)
                    visited.push(plus1)
                }
                let minus1 = key_minus1(currentKey, j)
                if (minus1 && visited.indexOf(minus1) == -1) {
                    queue.push(minus1)
                    visited.push(plus1)
                }
            }
        }
        step ++;
    }

    return -1;
}

function key_plus1 (key, plusIndex) {
    if(typeof(key) != "string" || key.length <= plusIndex) return null;
    let keyArr = key.split("");
    if (keyArr[plusIndex] == 9) {
        keyArr[plusIndex] = 0
    } else {
        keyArr[plusIndex] ++
    }
    return keyArr.join("")
}

function key_minus1 (key, plusIndex) {
    if(typeof(key) != "string" || key.length <= plusIndex) return null;
    let keyArr = key.split("");
    if (keyArr[plusIndex] == 0) {
        keyArr[plusIndex] = 9
    } else {
        keyArr[plusIndex] --
    }
    return keyArr.join("")
}

let steps = stepsToKey("0000", "1001", ["1010", "1110", "1111"])
console.log(steps)
console 命令行工具 X clear

                    
>
console