zoukankan      html  css  js  c++  java
  • 寻最短路径问题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));
  • 相关阅读:
    SAP字符串处理
    ABAP更换请求
    Odoo安装教程12-创建新的插件模块之设置视图层第二讲
    Odoo安装教程12-创建新的插件模块之设置视图层第一讲
    Odoo安装教程11-创建新的插件模块之设置访问权限
    SAP是什么?-SAP 各模块概览
    SAP是什么?-SAP 各产品释义
    SAP版本演进及区别-S/4 HANA 与R3(ECC)
    Odoo安装教程12-创建新的插件模块之设置视图层第二讲
    Odoo安装教程12-创建新的插件模块之设置视图层第一讲
  • 原文地址:https://www.cnblogs.com/aleafo/p/5249541.html
Copyright © 2011-2022 走看看