将菜鸟放到$ nxn $棋盘上以使它们精确攻击$ m $正方形的算法

时间:2018-08-03 17:19:55

标签: algorithm

假设有一个尺寸为nxn的棋盘,并且您将白嘴鸦放在棋盘上,以便它们共同攻击该棋盘上的m个正方形。给定n和m,您如何确定必须在棋盘上放置多少只白嘴鸦以及将它们放置在何处?

例如,假设电路板尺寸为3x3,并且您必须通过放置车叉在电路板上覆盖9个正方形。为此,或者简单地用车把乌鸦遮住木板,以确保没有安全的正方形,您可以将3个车在坐标(1,1);(1,2);(1,3)上放置在木板上(坐标中的第一个数字是列号,第二个是行号)。这样一来,由于车队会攻击与其所在位置相同的行和列中的所有方块,因此会攻击所有9个方块。

但是如何通过算法找到n和m的最佳坐标呢?

1 个答案:

答案 0 :(得分:1)

如果覆盖了 x 行和 y 列,则覆盖了 N(x + y)-xy 个方格,并且需要< strong> max(x,y)。

一种简单的算法可以解决您的问题,它会尝试针对每个 x 值计算 y 的匹配值,并记住需要最少操作次数的解决方案。

对于适用于更大问题的更复杂的解决方案,请注意-((n-x)(N-y)= N(x + y)-xy-N ^ 2

如果有一种解决方案可以覆盖 X 行和 y 列来攻击 m 个正方形,则:

m =-(N-x)(N-y)+ N ^ 2

如此

(N-x)(N-y)= N ^ 2-m

因此,每个解决方案都对应于产品的 N ^ 2-m 分解因数,而白勺数量最少的解决方案就是因子最接近的解决方案。您可以从 sqrt(N ^ 2-m)开始并递减计数直到找到除数,或者使用Fermat的因式分解方法:https://en.wikipedia.org/wiki/Fermat%27s_factorization_method