假设有一个尺寸为nxn的棋盘,并且您将白嘴鸦放在棋盘上,以便它们共同攻击该棋盘上的m个正方形。给定n和m,您如何确定必须在棋盘上放置多少只白嘴鸦以及将它们放置在何处?
例如,假设电路板尺寸为3x3,并且您必须通过放置车叉在电路板上覆盖9个正方形。为此,或者简单地用车把乌鸦遮住木板,以确保没有安全的正方形,您可以将3个车在坐标(1,1);(1,2);(1,3)上放置在木板上(坐标中的第一个数字是列号,第二个是行号)。这样一来,由于车队会攻击与其所在位置相同的行和列中的所有方块,因此会攻击所有9个方块。
但是如何通过算法找到n和m的最佳坐标呢?
答案 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