📌  相关文章
📜  可以放置在N * M棋盘上的最大无攻击骑士(1)

📅  最后修改于: 2023-12-03 14:50:38.015000             🧑  作者: Mango

可以放置在 N * M 棋盘上的最大无攻击骑士

介绍

在一个 N*M 的棋盘上,有多个骑士,骑士之间有攻击范围。现在需要选出尽可能多的骑士,使得它们之间没有攻击范围。

思路

骑士的攻击范围是每个棋子的周围八个位置。但是如果把棋子铺满整个棋盘,会有很多骑士之间的距离太近,难以达到不相互攻击的目的。

因此,我们可以使用贪心策略,从棋盘中心开始选择骑士。因为距离棋盘中心越远的骑士,与其他骑士的攻击范围重叠的概率越小。在各个半径上选取一个骑士即可。

代码
def max_knight(n: int, m: int) -> int:
    """
    求在 n * m 棋盘上最多可以放置的无攻击骑士数
    """
    radius = min(n, m) // 2
    return n * m // 2 + (n * m % 2 == 1 and radius % 2 == 1) * 1 + (radius - radius // 2) * 2

复杂度
  • 时间复杂度: $O(1)$
  • 空间复杂度: $O(1)$