You need to enable JavaScript to run this app. 骑士巡游类回溯问题:允许重复访格时如何规避路径无限循环
优惠活动
大模型
产品
解决方案
定价
更多

骑士巡游类回溯问题:允许重复访格时如何规避路径无限循环

核心问题与修复方案

你代码里的直接bug

  • 防回退逻辑完全颠倒,是无限循环的直接原因
    你原本想禁止骑士走回上一步的出发格,但写的判断if(path[pathindex-1]!=matrica[next_x][next_y])实际逻辑是:只要下一步的格子不等于当前站的格子,就允许走。
    骑士走日字本来就不可能一步跳回当前格,所以这个判断永远为真,等于没有任何限制。当骑士从(0,0)走到(1,2)时,因为要去的(0,0)和当前的(1,2)编号不同,会被判定为合法方向,直接形成(0,0)→(1,2)→(0,0)的无限两步循环。
    正确的判断应该是:拿下一步的格子编号,和path数组倒数第二个元素(也就是上一步的出发格)对比,相等就跳过该方向,即判断条件为matrica[next_x][next_y] != path[pathindex-2]。
  • 坐标校验时机错误
    你现在把越界检查放在递归函数内部,调用时没有先校验下一步的坐标是否在棋盘范围内,会产生大量无效的递归调用。应该在发起递归前完成坐标合法性判断,越界直接跳过,无需进入函数。
  • 缺少递归深度硬上限
    就算修正了两步回退的问题,你也挡不住长度≥3的环(比如A→B→C→A)。这类循环靠防回退逻辑是完全覆盖不到的,必须加深度限制才能避免无限递归。

回溯法完全适配你的场景

你觉得回溯法不好用,是直接照搬了经典骑士巡游的剪枝逻辑——经典巡游要求不重复走完所有格子,用全局visited数组强剪枝,但你的问题允许重复访问格子,本质是在骑士连通图上找满足顺序目标的任意路径,回溯完全可行,只要调整剪枝逻辑:

  1. 设合理的递归深度上限
    8x8棋盘总共仅64个格子,任意两点间如果存在路径,最短路径长度最多十几步。就算允许绕路重复走格子,设200步的深度上限完全足够,超过上限还没抵达目标就直接回退,从根源上杜绝无限循环。
  2. 加状态记忆化剪枝
    这里的搜索状态不是“当前在哪个格子”,而是(当前x坐标, 当前y坐标, 已完成的目标向量进度)。如果同一个状态之前已经搜索过、没找到有效路径,就直接跳过——因为不管你怎么绕路,只要回到同一个位置、目标进度没推进,之前已经试过所有可行方向,不会产生新结果。

针对你当前单目标场景的最小修改要点

  • 把8个骑士方向的偏移量存成固定数组,避免写重复的判断代码
  • 每次递归前先判断下一步坐标是否在棋盘范围内
  • 给递归函数加一个当前步数参数,超过100步就直接返回(剪枝)
  • 修正防回退的判断逻辑,跳过和path倒数第二个元素相同的方向
  • 扩大path数组的容量,避免深度增加后数组越界

内容的提问来源于stack exchange,提问作者infinitedreamer666

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 15:36:07