ループせずに直線での到達可能性をテストしようとする場合、ビットボード表現を使用できます。チェス、バイトとして表されるボードの行または列、および正方形 X のルークが正方形 T のターゲットをキャプチャできるかどうかという問題を想像してみてください。
T: ターゲット、X: 開始、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
ここには、AD からラベル付けされた 4 つの興味深いケースがあります。ケースAとBは扱いやすいです。
しかし、ケース C と D はそうではありません。> または < を単純にテストして、ターゲットが到達可能かどうか、またはパスがブロックされているかどうかを確認することはできません。
ただし、バイト内のビットをミラーリングすることにより、C、D を A、B に変換することができます。つまり、ビット 0 -> ビット 7、ビット 1 -> ビット 6、...
その反転を行うための最適化された実装があるかどうかは誰にもわかりませんか?
編集: 別のケースがあることに気付きました: E: OT__X___ ... 私の理論はうまくいきませんが、疑問は残ります。:)