寻最短路径问题2

寻最短路径问题。 重新整理了一下,加了些注释,以备后面参考。

/*
==============================================================================
// @pos          => 起点坐标id
// @endId        => 终点坐标id
// @key          => 返回的字符串,保存上一层递归完成的路径节点
// @len          => 节点的id差(本例中没用到)
// @startId         => 原始起点,防止走回头路
// @deep         => 递归深度
// @startDeep    => 递归初始深度,用来确定是否为首次递归,防止走回头路,陷入死循环。
==============================================================================
 */


function tree(beginId, endId, pathArray, key, startId, deep, startDeep) {

    if (deep < 0) return;  //到达递归层数,退出递归

    var others = [];

    for (x in pathArray) {
        var tmp = pathArray[x];

        if (tmp[0] == beginId || tmp[1] == beginId) { //找到本次循环的起点

            var other = tmp[0] == beginId ? tmp[1] : tmp[0]; //本次循环起点的另一端

            //防止走回头路
            if (deep < startDeep && beginId == startId)  continue;

            others.push(other); //经过筛选的路径保存到others数组里面
            
        }
    }

    //遍历经过筛选的节点进行第二次查找,并根据判断结果进行递归
    for (y in others) {
        other = others[y];

        if (other == endId) { //找到通往重点的一条路径,保存到result数组
            result.push(key + endId + ",|");
            continue;
        }

        tree(other, endId, pathArray, key + other + ",", startId, deep - 1, startDeep);
    }
}

后面这一段,是从上面遍历所有可用路径的列表中找到最短的一条。 结尾处附运行示例。

/*
==============================================================================
// 获取最短路径

// @a           =>  起点节点ID
// @b           =>  终点节点ID
// @pathArray  =>  路径数组,二维数组  如 
// var pathArray = [[185,184],[186,185],[187,186],[188,187],[189,187],[191,189]];
// 返回结果为[a,b,c] 最短路径的节点ID数组
==============================================================================
*/

function get_min_path(a, b, pathArray) {

    var ret_path = [a];
    
    //先判断是否能直接到达,若能直接达到则直接返回结果即可
    for (var i = 0; i < pathArray.length; i++) {
        var e = pathArray[i];
        if (e.toString() == a + ',' + b || e.toString() == b + ',' + a) {
            return [a,b];
        }
    };


    //若未能直接找到,则进行最短路径的查找
    tree(a, b, pathArray, "", a, 5, 5);
    var ret = result;
    result = [];
    var min = 100;
    var min_path_str = '';
    //求出最短的路径
    for (x in ret) {
        var path_arr_str = ret[x].split('|')[0];
        var path_arr = path_arr_str.split(",");
        var rank = path_arr.length;
        if (rank < min) {
            min = rank;
            min_path_str = path_arr_str;
        }
    }
    return ret_path.concat(min_path_str.slice(0, -1).split(","));
}


// 这里是一个参数的示例,方便后续构造
// 所有路径,不区分开始和结束节点的前后顺序
var pathArray = [[185,184],[186,185],[187,186],[188,187],[189,187],[191,189]];
var pathArray = [[34,50],[35,30],[40,35],[50,40]];
//起点ID
var begId = 34; 
//终点ID
var endId = 40;
console.log(get_min_path(begId,endId,pathArray));
console.log(get_min_path(35,50,pathArray));
原文地址:https://www.cnblogs.com/aleafo/p/5249541.html