问题:在NxN的棋盘上放置N个主教,使得所有的方格都被至少一个主教占据或攻击。请提供一个有效的算法来解决这个问题。
解决方案:
解决方案:
_ _ _ _ ♗ _ _ _ _ _ _ _ _ ♗ _ _ _ _ _ _ _ _ ♗ _ _ _ _ _ _ _ _ ♗ _ _ _ _ _ _ _ _ ♗ _ _ _ _ _ _ _ _ ♗ _ _ _ _ _ _ _ _ ♗ _ _ _ _ _ _ _ _ ♗ _ _ _ _ _ _ _ _ ♗ _ _ _ _
这是一个棋盘,每个黑点上有一个♗(象)棋子。
我假设您是在寻求一些优化,因为回溯算法就是它本身。
首先要注意的是,您可以将黑色和白色分开 - 您可以取 i + j = N
时的 B_i * W_j
之和。您还可以将对角线视为简单的网格(带有约束条件),这可能会使代码更紧凑,也更容易理解。另一个优化是注意到颜色并不一定重要-某些黑色的结果可以用于某些白色。找出何时发生以及何时不会发生。
希望这足够好-对于一些较小的N来说应该足够了。
为什么要回溯?使用少量解决方案来获得证明。
即使是贪心算法也足够了:计算每个方格可到达的正方形数量。选择一个具有最大覆盖范围且不与先前选择的覆盖范围重叠的方格。重复此过程。
歧义会产生水平、垂直和中心侧面的变化。
N个主教只足以用一个主教到达每个方格。如果您选择了具有重叠覆盖范围的方格,则可到达的方格的最终总数将较低。嗯,也许您需要量化任何给定坏方格的降低程度。听起来可行。
对于如此庞大的问题空间,暴力回溯似乎并不可行。