0%

小心,不要把这个 step 也用于判重,如果 step 要用于优先队列,那么就使用两个比较器

另外,再提醒你两个后续也会出问题的点,虽然它们不是这次输出变成 1..8 的主因:

  • 你的 set<L_R_A_B_C> memo 判重会用到 operator<,但你把 step 也放进比较里了。
1
2
3
4
5
bool operator<(const L_R_A_B_C &o) const {
if (step != o.step) return step > o.step;
if (hands != o.hands) return hands < o.hands;
return tower_ls < o.tower_ls;
}

这会导致“同一个局面但 step 不同”被当成两个不同状态,不是你真正想要的“局面判重”。

  • 你的边权其实是 0/1 的:
    • > 手,代价是 1
    • > 栈,代价是 0
      这种情况最好用 0-1 BFS,或者至少用 dist 做最短路,不能简单地“第一次入队就判重”。

如果你愿意,我下一条可以直接按你这份代码的风格,给你整理一个最适合这题打表的状态设计 + 0-1 BFS 写法