当尝试在没有循环的情况下测试直线上的可达性时,您可以使用 Bitboard 表示。想象一下国际象棋,棋盘的一行或一列表示为一个字节,以及一个问题,如果 X 方格上的 Rook 可以捕获方格 T 上的目标。
设 T:Target,X:Start,O:其他占用方格,_:空方格
我发现使用这些符号来可视化可能的场景很方便:
// __OXO___ -> X is between others on both sides
// __XOO___ -> X is leftmost of others
// __OOX___ -> X is rightmost of other others
//A: T_OOX___ -> Target left of X x not leftmost -> T > X and O > X -> NOT reachable
//B: T_XOO___ -> Target left of X, X leftmost -> T > X and O < X -> reachable
//C: __OXO_T_ -> Target right of X, X embedded -> T < X and ???? -> NOT reachable
//D: __OOX_T_ -> Target right of X, X rightmost -> T < X and ???? -> reachable
这里有 4 个感兴趣的案例 - 来自 AD。情况 A 和 B 很容易处理。
但情况 C 和 D 不是。您不能简单地测试 > 或 < 来确定目标是否可达或路径是否被阻塞。
不过,可以做的是通过镜像字节中的位将 C、D 转换为 A、B。所以位 0 -> 位 7,位 1 -> 位 6,...
有谁知道是否有优化的实现来进行翻转?
编辑:我刚刚注意到另一种情况是:E:OT__X___ ...我的理论变坏了,但问题仍然存在。:)