| | |
| | | } |
| | | |
| | | /** |
| | | * 优化路径:去除空间上的重复点(避免来回走) |
| | | * 检测并移除 A->B->A 模式的来回走,避免不必要的绕行 |
| | | * |
| | | * @param codeList 原始路径代码列表 |
| | | * @return 优化后的路径代码列表 |
| | | * 优化路径 |
| | | */ |
| | | private List<PathCode> optimizePathByRemovingBacktrack(List<PathCode> codeList) { |
| | | if (codeList == null || codeList.size() <= 2) { |
| | |
| | | while (i < codeList.size()) { |
| | | PathCode current = codeList.get(i); |
| | | |
| | | // 检查是否是来回走模式:A->B->A(连续三个点,第一个和第三个相同) |
| | | // 如果出现来回走,跳过B和第二个A,直接到下一个不同的点 |
| | | if (i < codeList.size() - 2) { |
| | | PathCode next = codeList.get(i + 1); |
| | | PathCode nextNext = codeList.get(i + 2); |
| | | |
| | | // 检测来回走:当前位置 == 下下个位置,且中间位置不同 |
| | | if (current.getCode().equals(nextNext.getCode()) && |
| | | !current.getCode().equals(next.getCode())) { |
| | | // 来回走:跳过B和第二个A,直接处理下一个不同的点 |
| | | // 找到下一个与当前点不同的位置 |
| | | int j = i + 2; |
| | | while (j < codeList.size() && codeList.get(j).getCode().equals(current.getCode())) { |
| | | j++; |
| | | } |
| | | // 如果找到了不同的点,或者到达末尾,跳过来回走的部分 |
| | | if (j < codeList.size()) { |
| | | i = j; // 跳到下一个不同的点 |
| | | i = j; |
| | | continue; |
| | | } else { |
| | | // 如果后面都是相同点,保留当前点(可能是目标点) |
| | | break; |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | // 重新计算方向(因为优化后跳过了中间点,方向需要更新) |
| | | // 重新计算方向 |
| | | for (int k = 0; k < optimized.size(); k++) { |
| | | PathCode code = optimized.get(k); |
| | | if (k < optimized.size() - 1) { |