This commit is contained in:
krahets
2023-05-22 22:01:26 +08:00
parent f31f630655
commit 9a0252f484
19 changed files with 137 additions and 135 deletions

View File

@@ -2836,23 +2836,25 @@
<a id="__codelineno-42-18" name="__codelineno-42-18" href="#__codelineno-42-18"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;恢复状态&quot;&quot;&quot;</span>
<a id="__codelineno-42-19" name="__codelineno-42-19" href="#__codelineno-42-19"></a> <span class="n">state</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<a id="__codelineno-42-20" name="__codelineno-42-20" href="#__codelineno-42-20"></a>
<a id="__codelineno-42-21" name="__codelineno-42-21" href="#__codelineno-42-21"></a><span class="k">def</span> <span class="nf">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span> <span class="n">choices</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span> <span class="n">res</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">list</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">]]):</span>
<a id="__codelineno-42-22" name="__codelineno-42-22" href="#__codelineno-42-22"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;回溯算法:例题三&quot;&quot;&quot;</span>
<a id="__codelineno-42-23" name="__codelineno-42-23" href="#__codelineno-42-23"></a> <span class="c1"># 检查是否为解</span>
<a id="__codelineno-42-24" name="__codelineno-42-24" href="#__codelineno-42-24"></a> <span class="k">if</span> <span class="n">is_solution</span><span class="p">(</span><span class="n">state</span><span class="p">):</span>
<a id="__codelineno-42-25" name="__codelineno-42-25" href="#__codelineno-42-25"></a> <span class="c1"># 记录</span>
<a id="__codelineno-42-26" name="__codelineno-42-26" href="#__codelineno-42-26"></a> <span class="n">record_solution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
<a id="__codelineno-42-27" name="__codelineno-42-27" href="#__codelineno-42-27"></a> <span class="k">return</span>
<a id="__codelineno-42-28" name="__codelineno-42-28" href="#__codelineno-42-28"></a> <span class="c1"># 遍历所有选择</span>
<a id="__codelineno-42-29" name="__codelineno-42-29" href="#__codelineno-42-29"></a> <span class="k">for</span> <span class="n">choice</span> <span class="ow">in</span> <span class="n">choices</span><span class="p">:</span>
<a id="__codelineno-42-30" name="__codelineno-42-30" href="#__codelineno-42-30"></a> <span class="c1"># 剪枝:检查选择是否合法</span>
<a id="__codelineno-42-31" name="__codelineno-42-31" href="#__codelineno-42-31"></a> <span class="k">if</span> <span class="n">is_valid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">choice</span><span class="p">):</span>
<a id="__codelineno-42-32" name="__codelineno-42-32" href="#__codelineno-42-32"></a> <span class="c1"># 尝试:做出选择,更新状态</span>
<a id="__codelineno-42-33" name="__codelineno-42-33" href="#__codelineno-42-33"></a> <span class="n">make_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">choice</span><span class="p">)</span>
<a id="__codelineno-42-34" name="__codelineno-42-34" href="#__codelineno-42-34"></a> <span class="c1"># 进行下一轮选择</span>
<a id="__codelineno-42-35" name="__codelineno-42-35" href="#__codelineno-42-35"></a> <span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="p">[</span><span class="n">choice</span><span class="o">.</span><span class="n">left</span><span class="p">,</span> <span class="n">choice</span><span class="o">.</span><span class="n">right</span><span class="p">],</span> <span class="n">res</span><span class="p">)</span>
<a id="__codelineno-42-36" name="__codelineno-42-36" href="#__codelineno-42-36"></a> <span class="c1"># 回退:撤销选择,恢复到之前的状态</span>
<a id="__codelineno-42-37" name="__codelineno-42-37" href="#__codelineno-42-37"></a> <span class="n">undo_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">choice</span><span class="p">)</span>
<a id="__codelineno-42-21" name="__codelineno-42-21" href="#__codelineno-42-21"></a><span class="k">def</span> <span class="nf">backtrack</span><span class="p">(</span>
<a id="__codelineno-42-22" name="__codelineno-42-22" href="#__codelineno-42-22"></a> <span class="n">state</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span> <span class="n">choices</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span> <span class="n">res</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">list</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">]]</span>
<a id="__codelineno-42-23" name="__codelineno-42-23" href="#__codelineno-42-23"></a><span class="p">):</span>
<a id="__codelineno-42-24" name="__codelineno-42-24" href="#__codelineno-42-24"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;回溯算法:例题三&quot;&quot;&quot;</span>
<a id="__codelineno-42-25" name="__codelineno-42-25" href="#__codelineno-42-25"></a> <span class="c1"># 检查是否为</span>
<a id="__codelineno-42-26" name="__codelineno-42-26" href="#__codelineno-42-26"></a> <span class="k">if</span> <span class="n">is_solution</span><span class="p">(</span><span class="n">state</span><span class="p">):</span>
<a id="__codelineno-42-27" name="__codelineno-42-27" href="#__codelineno-42-27"></a> <span class="c1"># 记录解</span>
<a id="__codelineno-42-28" name="__codelineno-42-28" href="#__codelineno-42-28"></a> <span class="n">record_solution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
<a id="__codelineno-42-29" name="__codelineno-42-29" href="#__codelineno-42-29"></a> <span class="k">return</span>
<a id="__codelineno-42-30" name="__codelineno-42-30" href="#__codelineno-42-30"></a> <span class="c1"># 遍历所有选择</span>
<a id="__codelineno-42-31" name="__codelineno-42-31" href="#__codelineno-42-31"></a> <span class="k">for</span> <span class="n">choice</span> <span class="ow">in</span> <span class="n">choices</span><span class="p">:</span>
<a id="__codelineno-42-32" name="__codelineno-42-32" href="#__codelineno-42-32"></a> <span class="c1"># 剪枝:检查选择是否合法</span>
<a id="__codelineno-42-33" name="__codelineno-42-33" href="#__codelineno-42-33"></a> <span class="k">if</span> <span class="n">is_valid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">choice</span><span class="p">):</span>
<a id="__codelineno-42-34" name="__codelineno-42-34" href="#__codelineno-42-34"></a> <span class="c1"># 尝试:做出选择,更新状态</span>
<a id="__codelineno-42-35" name="__codelineno-42-35" href="#__codelineno-42-35"></a> <span class="n">make_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">choice</span><span class="p">)</span>
<a id="__codelineno-42-36" name="__codelineno-42-36" href="#__codelineno-42-36"></a> <span class="c1"># 进行下一轮选择</span>
<a id="__codelineno-42-37" name="__codelineno-42-37" href="#__codelineno-42-37"></a> <span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="p">[</span><span class="n">choice</span><span class="o">.</span><span class="n">left</span><span class="p">,</span> <span class="n">choice</span><span class="o">.</span><span class="n">right</span><span class="p">],</span> <span class="n">res</span><span class="p">)</span>
<a id="__codelineno-42-38" name="__codelineno-42-38" href="#__codelineno-42-38"></a> <span class="c1"># 回退:撤销选择,恢复到之前的状态</span>
<a id="__codelineno-42-39" name="__codelineno-42-39" href="#__codelineno-42-39"></a> <span class="n">undo_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">choice</span><span class="p">)</span>
</code></pre></div>
</div>
<div class="tabbed-block">