1. 题目链接
Kickstart Round H 2019 B. Diagonal Puzzle
2. 题目描述
有一个 $N\times N$ 的正方形棋盘,棋盘上每个位置要么是黑子,要么是白子。现在需要用最少的步数将白子全部编程黑子。
每一步你可以任意选择一条该正方形的对角线,然后将对角线上的所有棋子都翻转 (白变黑 or 黑变白)。
下面是 $3\times 3$ 正方形的10种对角线:
1 | /.. ./. ../ ... ... |
3. 解题思路
对于 $N\times N$ 的正方形来说,共存在 $\mathbf{4N-2}$ 条对角线。然后,对于一条对角线,多次翻转是没有意义的(翻转 2 次跟翻转 0 次没有区别),就是说每条对角线只有两种状态:翻转、不翻转。
然后对于棋盘中的每一个位置,都存在 2 条对角线经过该位置:
- 当这个位置为白子时,这两条对角线的状态必须是互斥的;
- 当这个位置为黑子时,这两条对角线的状态必须是相同的。
这样,整个问题就是变成了对 对角线的2-SAT/二染色问题。而上述两种情况,可以看成染色的限制条件。
那我们对每个连通块进行 dfs 进行二染色,然后统计染色为 0、1 的节点个数。如果染色为 0 的节点个数较少,我们则翻转连通块中所有染色为 0 的节点;反之,则翻转染色为 1 的节点。
4. 参考代码
1 |
|