... 再帰スタックに戻り、問題を解決するために再度開始するという概念を思いつかないようです。
バックトラックでは、再び開始することはありません。代わりに、現在の状況ですべてのオプションを反復処理します。
迷路の解決策を見つけることを考えてください。2つの異なるパスがある時点で、左側のパスを最初に試します。左側の出口で出口につながらない場合は、ポイントに戻って別のパスを試してください。それがバックトラッキングの仕組みです。バックトラッキングを使用できる8 Qおよびその他の問題では、混乱する部分は問題領域にあります。特定の状況でオプションを決定論的に反復する方法です。
編集:以下は、バックトラックを理解するのに役立つ擬似コードです。
# depending on the problem, backtracking is not necessarily calling the
# method itself directly. for now, let's just stick with the simple case.
def backtracking(state)
option_list = state.get_all_options
option_list.each {|option|
state.apply option
return resolved if state.is_resolved
return resolved if backtracking(state) == resolved
state.undo option
}
return not_resolved
end
8Qの質問:
- state.get_all_optionsは、次のクイーンの可能な位置のリストを返します
- state.is_resolvedは、すべてのクイーンがボードに載っているかどうか、またお互いが良いかどうかをテストします。
- state.applyおよびstate.undoは、位置決めを適用または取り消すためにボードを変更します。