Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 将车放置在$nxn$棋盘上的算法,以便它们精确攻击$m$方块_Algorithm - Fatal编程技术网

Algorithm 将车放置在$nxn$棋盘上的算法,以便它们精确攻击$m$方块

Algorithm 将车放置在$nxn$棋盘上的算法,以便它们精确攻击$m$方块,algorithm,Algorithm,假设有一个尺寸为nxn的棋盘,你把车放在棋盘上,让它们集体攻击棋盘上的m个方块。给定n和m,如何确定棋盘上必须放置多少辆车,以及将它们放置在何处 例如,假设电路板尺寸为3x3,您必须通过放置Rook来覆盖电路板上的9个正方形。要做到这一点,或者简单地用车覆盖木板,这样就没有安全的方块,你可以在坐标(1,1)中放置3辆车;(1,2);(1,3)在板上(坐标中的第一个数字是列号,第二个是行号)。这样,由于一辆车攻击与其所在位置相同的行和列中的所有方块,因此所有9个方块都会受到攻击 但是,如何用算法找

假设有一个尺寸为nxn的棋盘,你把车放在棋盘上,让它们集体攻击棋盘上的m个方块。给定n和m,如何确定棋盘上必须放置多少辆车,以及将它们放置在何处

例如,假设电路板尺寸为3x3,您必须通过放置Rook来覆盖电路板上的9个正方形。要做到这一点,或者简单地用车覆盖木板,这样就没有安全的方块,你可以在坐标(1,1)中放置3辆车;(1,2);(1,3)在板上(坐标中的第一个数字是列号,第二个是行号)。这样,由于一辆车攻击与其所在位置相同的行和列中的所有方块,因此所有9个方块都会受到攻击


但是,如何用算法找到任意n和m的最佳坐标呢?

如果覆盖x行和y列,那么覆盖n(x+y)-xy正方形,需要max(x,y)rooks

解决问题的一个简单算法是,尝试为每个可能的x值计算y的匹配值,并记住需要最少rooks的解决方案

对于更复杂的、适用于更大问题的解决方案,请注意-(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分解为一个乘积,并且使用最少的rook数的解决方案是因子最接近的解决方案。你可以从sqrt(N^2-m)开始倒计时,直到找到一个除数,或者使用Fermat的因式分解方法:

我投票将这个问题作为离题题题结束,因为它与编程无关。这是一个可以通过编写程序来解决的问题,那么它是如何离题的呢@许多问题都可以通过编写一个程序来解决,但你所问的是一个非常人工的问题(把车放在任意大小的棋盘上),答案是数学证明(你需要提出一个算法,然后证明它是正确的)。这不是一个编码问题。哦,好吧,我会把它贴到math stackexchange上,谢谢你的澄清。@melpomeneI想补充一点,到目前为止,我是唯一一个认为这个问题离题的人,但另外两个人投票认为它“太宽了”。我理解n(x+y)术语,但是为什么需要用xy减去这个数字呢?@hexhdkappa123因为包含排除原则。添加所有被水平线覆盖的对象。然后是垂直线。然后减去交点。