📅  最后修改于: 2023-12-03 14:50:38.015000             🧑  作者: Mango
在一个 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