1 条题解

  • 0
    @ 2025-10-23 19:59:01

    关键观察:

    最后一次操作会完全覆盖某一行或某一列 如果某行/列的所有格子颜色相同,那么它可能是最后一次被涂色的 我们可以逆向思考:从目标图案反推操作序列

    解题思路

    逆向构造法 我们从目标图案开始,逆向还原操作序列:

    寻找候选操作:

    检查每一行:如果该行所有格子颜色相同,那么这行可能是最后一次被涂色的

    检查每一列:如果该列所有格子颜色相同,那么这列可能是最后一次被涂色的

    执行逆向操作:

    选择这样一个行或列,记录操作:"将这一行/列涂成当前颜色"

    在逆向过程中,这相当于"撤销"这次操作,即把这一行/列变成"未确定"状态

    实际实现时,我们标记这些位置为"已处理"

    重复过程:

    不断寻找可以"撤销"的行或列

    直到所有格子都被处理

    输出操作序列:

    将逆向得到的操作序列反转,就是正向的操作序列

    算法步骤

    读取输入,存储目标网格

    初始化行列状态数组

    使用队列处理可以"撤销"的行列:

    检查每行是否所有未被覆盖的格子颜色相同

    检查每列是否所有未被覆盖的格子颜色相同

    将找到的行列加入队列,记录操作

    处理队列中的行列,更新状态

    重复直到所有行列都被处理或无法继续

    输出操作序列(正向顺序)

    算法复杂度

    时间复杂度:O(n×m×26)O(n \times m \times 26),其中 2626 是颜色种类数

    空间复杂度:O(n×m)O(n \times m)

    正确性证明

    该算法的正确性基于以下事实:

    最后一次操作的行或列必然所有格子颜色相同

    逆向移除这样的行或列不会影响其他格子的最终颜色

    保证在 n+mn + m 步内完成,因为最多处理所有行和列各一次

    • 1

    信息

    ID
    3909
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者