1 条题解
-
0
关键观察:
最后一次操作会完全覆盖某一行或某一列 如果某行/列的所有格子颜色相同,那么它可能是最后一次被涂色的 我们可以逆向思考:从目标图案反推操作序列
解题思路
逆向构造法 我们从目标图案开始,逆向还原操作序列:
寻找候选操作:
检查每一行:如果该行所有格子颜色相同,那么这行可能是最后一次被涂色的
检查每一列:如果该列所有格子颜色相同,那么这列可能是最后一次被涂色的
执行逆向操作:
选择这样一个行或列,记录操作:"将这一行/列涂成当前颜色"
在逆向过程中,这相当于"撤销"这次操作,即把这一行/列变成"未确定"状态
实际实现时,我们标记这些位置为"已处理"
重复过程:
不断寻找可以"撤销"的行或列
直到所有格子都被处理
输出操作序列:
将逆向得到的操作序列反转,就是正向的操作序列
算法步骤
读取输入,存储目标网格
初始化行列状态数组
使用队列处理可以"撤销"的行列:
检查每行是否所有未被覆盖的格子颜色相同
检查每列是否所有未被覆盖的格子颜色相同
将找到的行列加入队列,记录操作
处理队列中的行列,更新状态
重复直到所有行列都被处理或无法继续
输出操作序列(正向顺序)
算法复杂度
时间复杂度:,其中 是颜色种类数
空间复杂度:
正确性证明
该算法的正确性基于以下事实:
最后一次操作的行或列必然所有格子颜色相同
逆向移除这样的行或列不会影响其他格子的最终颜色
保证在 步内完成,因为最多处理所有行和列各一次
- 1
信息
- ID
- 3909
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者