Files
bettergi-scripts-list/repo/js/AutoLeyLineOutcrop/utils/breadthFirstPathSearch.js
ddaodan d7fd6a5982 refactor: 优化日志输出级别并简化工具加载逻辑 (#957)
- 将部分info级别日志降级为debug级别
- 重构工具文件加载逻辑
- 修改部分错误提示信息
2025-06-01 01:19:13 +08:00

75 lines
2.7 KiB
JavaScript

/**
* 使用广度优先搜索算法查找从传送点到目标的所有路径
* @param {Object} nodeData - 节点数据
* @param {Object} targetNode - 目标节点
* @param {Object} nodeMap - 节点映射
* @returns {Array} 找到的所有可行路径
*/
this.breadthFirstPathSearch =
function (nodeData, targetNode, nodeMap) {
// 存储找到的所有有效路径
const validPaths = [];
// 获取所有传送点作为起点
const teleportNodes = nodeData.node.filter(node => node.type === "teleport");
log.debug(`找到 ${teleportNodes.length} 个传送点作为可能的起点`);
// 对每个传送点,尝试查找到目标的路径
for (const startNode of teleportNodes) {
// 初始化队列,每个元素包含 [当前节点, 路径信息]
const queue = [[startNode, {
startNode: startNode,
routes: [],
visitedNodes: new Set([startNode.id])
}]];
// 广度优先搜索
while (queue.length > 0) {
const [currentNode, pathInfo] = queue.shift();
// 如果已经到达目标节点
if (currentNode.id === targetNode.id) {
validPaths.push({
startNode: pathInfo.startNode,
targetNode: targetNode,
routes: [...pathInfo.routes]
});
continue; // 找到一条路径,继续搜索其他可能路径
}
// 检查当前节点的下一个连接
if (currentNode.next && currentNode.next.length > 0) {
for (const nextRoute of currentNode.next) {
const nextNodeId = nextRoute.target;
// 避免循环
if (pathInfo.visitedNodes.has(nextNodeId)) {
continue;
}
const nextNode = nodeMap[nextNodeId];
if (!nextNode) {
continue;
}
// 创建新的路径信息
const newPathInfo = {
startNode: pathInfo.startNode,
routes: [...pathInfo.routes, nextRoute.route],
visitedNodes: new Set([...pathInfo.visitedNodes, nextNodeId])
};
// 加入队列
queue.push([nextNode, newPathInfo]);
}
}
}
}
// 检查是否存在反向路径
const reversePaths = findReversePathsIfNeeded(nodeData, targetNode, nodeMap, validPaths);
validPaths.push(...reversePaths);
log.debug(`共找到 ${validPaths.length} 条有效路径`);
return validPaths;
}