#eFTFGlydlt60x6903. 骑士放置
骑士放置
好的,这是整理好的题面,不含解题思路,只包含样例解释。
题目描述
给定一个 的棋盘,有一些格子禁止放棋子。
问棋盘上最多能放多少个不能互相攻击的国际象棋骑士。
骑士的攻击方式:按“日”字,即 或 ,可以攻击到其他位置的骑士(没有“别马腿”规则)。
输入格式
第一行包含三个整数 ,其中 表示禁止放置的格子的数量。
接下来 行,每行包含两个整数 和 ,表示位于第 行第 列的格子禁止放置,行列数从 开始。
输出格式
输出一个整数,表示最多能放置的骑士数。
数据范围
输入样例
2 3 0
输出样例
4
样例解释
(没有禁止格)。
棋盘是 的格子:
(1,1) (1,2) (1,3)
(2,1) (2,2) (2,3)
骑士的攻击范围是“日”字形,在这个小棋盘上,最多能放多少个互不攻击的骑士?
尝试放置: 一种方案:
- 放在 (1,1), (1,3), (2,1), (2,3)
检查攻击:
(1,1) 与 (1,3) 差 (0,2) 不攻击
(1,1) 与 (2,1) 差 (1,0) 不攻击
(1,1) 与 (2,3) 差 (1,2) → 这是“日”字攻击((1,2) 或 (2,1) 是攻击方式,差 (1,2) 对应骑士攻击,对,所以 (1,1) 和 (2,3) 互相攻击,不能同时放)
所以上面方案不行。
重新考虑:
将棋盘按国际象棋棋盘方式染色(黑白相间),骑士总是从黑格跳到白格,从白格跳到黑格,所以攻击关系只在黑白格之间。
因此这是一个二分图(黑格与白格之间可能攻击)。
棋盘染色(设 (1,1) 为黑):
黑: (1,1),(1,3),(2,2)
白: (1,2),(2,1),(2,3)
检查攻击关系:
- (1,1) 攻击 (1,2)? 不(差 (0,1) 不是日字)
(1,1) 攻击 (2,3)? 是(差 (1,2))
(1,1) 攻击 (2,1)? 不(差 (1,0))
...
实际我们可以直接找最大独立集:二分图最大独立集 = 总点数 - 最大匹配。
已知 个格,可以找到最大匹配数,然后得到最大独立集大小。
通过尝试发现,最大可以放 4 个互不攻击的骑士:
例如放在 (1,1),(1,2),(2,2),(2,3)
检查:
(1,1) 与 (2,3) 差 (1,2) 攻击,但这里 (2,3) 有骑士,(1,1) 也有骑士,所以不行?我们要检查这些位置是否互相攻击,需要逐对检查。
不如枚举小棋盘:
棋盘,一种可行方案是放满 6 个?不可能,相邻日字位置会攻击。
尝试: (1,1),(1,3),(2,1),(2,3) 不行,因为 (1,1) 与 (2,3) 攻击。
换 (1,1),(1,2),(2,2),(2,3) 也不行,因为 (1,2) 与 (2,2) 差 (1,0) 不攻击,但 (1,2) 与 (2,3) 差 (1,1) 不攻击,(2,2) 与 (1,1) 差 (-1,-1) 不攻击,(2,2) 与 (2,3) 差 (0,1) 不攻击,(2,2) 与 (1,2) 差 (-1,0) 不攻击,似乎都不攻击?等等,骑士攻击是 (±1,±2) 或 (±2,±1),这里所有差都不是这种,所以确实不攻击。
那么 (1,1),(1,2),(2,2),(2,3) 四个位置都互不攻击,因此可以放 4 个。
能否放 5 个?
共 6 格,如果放 5 个,相当于只有 1 个空位。骑士攻击会导致很多位置不能共存,试一下不行。
因此最大是 4。
输出 4。