寻最短路径问题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));