构造 - Mine Sweeper II - ICPC 2020 上海

构造 - Mine Sweeper II - ICPC 2020 上海

题意:

给 定 两 个 n × m 的 由 ′ X ′ 和 ′ . ′ 矩 阵 A 和 B , 表 示 两 个 扫 雷 的 矩 阵 , 给定两个n×m的由'X'和'.'矩阵A和B,表示两个扫雷的矩阵, n×mX.AB

′ X ′ 表 示 雷 , ′ . ′ 表 示 空 地 , 'X'表示雷,'.'表示空地, X.

在 扫 雷 游 戏 中 , 每 个 空 地 会 有 一 个 数 字 , 表 示 周 围 8 个 方 向 雷 的 数 量 。 在扫雷游戏中,每个空地会有一个数字,表示周围8个方向雷的数量。 8

对 于 矩 阵 A 和 B , 各 个 空 地 的 数 字 之 和 , 记 为 W A 和 W B 。 对于矩阵A和B,各个空地的数字之和,记为W_A和W_B。 ABWAWB

试 问 , 能 否 对 矩 阵 B 进 行 不 超 过 ⌊ n ⋅ m 2 ⌋ 次 操 作 , 每 次 操 作 可 以 将 一 个 ′ X ′ ( ′ . ′ ) 变 成 ′ . ′ ( ′ X ′ ) , 试问,能否对矩阵B进行不超过\lfloor\frac{n·m}{2}\rfloor次操作,每次操作可以将一个'X'('.')变成'.'('X'), B2nmX(.).(X)

使 得 W B = W A 。 使得W_B=W_A。 使WB=WA

如 果 不 能 , 输 出 − 1 。 如果不能,输出-1。 1

输入:

首 行 包 括 两 个 正 整 数 n 和 m ( 0 ≤ n , m ≤ 1000 ) , 首行包括两个正整数n和m(0\le n,m\le 1000), nm(0n,m1000)

接 着 2 个 n × m 的 矩 阵 , 表 示 A 和 B 接着2个n×m的矩阵,表示A和B 2n×mAB

输出:

一 个 n × m 的 矩 阵 , 表 示 修 改 后 的 矩 阵 。 一个n×m的矩阵,表示修改后的矩阵。 n×m

若 有 解 , 输 出 任 意 一 组 。 否 则 输 出 − 1 。 若有解,输出任意一组。否则输出-1。 1

示例1
输入

2 4
X..X
X.X.
X.X.
.X..

输出

X.XX
.X..

分析:

本 题 有 一 个 很 重 要 的 性 质 : 本题有一个很重要的性质:

将 一 个 矩 阵 M 的 ′ X ′ 和 ′ . ′ 对 换 , 矩 阵 M 的 权 置 W M 不 变 。 将一个矩阵M的'X'和'.'对换,矩阵M的权置W_M不变。 MX.MWM

证明:

我 们 考 虑 对 一 个 ′ X ′ 进 行 操 作 , 那 么 它 将 会 变 成 一 个 ′ . ′ , 我们考虑对一个'X'进行操作,那么它将会变成一个'.', X.

假 设 它 周 围 8 个 方 向 ′ X ′ 的 数 量 为 c n t 1 , ′ . ′ 的 数 量 为 c n t 2 假设它周围8个方向'X'的数量为cnt_1,'.'的数量为cnt_2 8Xcnt1.cnt2

那 么 本 次 操 作 将 会 使 得 权 置 增 加 c n t 1 , 减 少 c n t 2 , 即 权 置 改 变 c n t 1 − c n t 2 那么本次操作将会使得权置增加cnt_1,减少cnt_2,即权置改变cnt_1-cnt_2 使cnt1cnt2cnt1cnt2

同 理 , 如 果 我 们 对 ′ . ′ 进 行 操 作 , 权 置 将 改 变 c n t 2 − c n t 1 。 同理,如果我们对'.'进行操作,权置将改变cnt_2-cnt_1。 .cnt2cnt1

如 下 图 : 如下图:

在这里插入图片描述
如 果 我 们 对 蓝 色 的 点 操 作 , 那 么 它 所 能 影 响 到 的 点 的 范 围 应 当 是 绿 色 的 点 , 对 隔 一 层 的 点 不 会 产 生 影 响 。 如果我们对蓝色的点操作,那么它所能影响到的点的范围应当是绿色的点,对隔一层的点不会产生影响。 绿

为 了 方 便 , 假 设 蓝 色 点 是 ′ X ′ , 修 改 它 产 生 的 贡 献 为 c n t 1 − c n t 2 , 为了方便,假设蓝色点是'X',修改它产生的贡献为cnt_1-cnt_2, 便Xcnt1cnt2

此 时 我 们 将 绿 色 的 一 层 点 全 部 变 反 , 则 ′ X ′ 周 围 的 ′ X ′ 数 量 将 变 为 c n t 2 , ′ . ′ 的 数 量 将 变 成 c n t 1 , 此时我们将绿色的一层点全部变反,则'X'周围的'X'数量将变为cnt_2,'.'的数量将变成cnt_1, 绿XXcnt2.cnt1

此 时 将 会 产 生 c n t 2 − c n t 1 的 贡 献 , 此时将会产生cnt_2-cnt_1的贡献, cnt2cnt1

因 此 , 和 的 贡 献 为 ( c n t 1 − c n t 2 ) + ( c n t 2 − c n t 1 ) = 0 。 因此,和的贡献为(cnt_1-cnt_2)+(cnt_2-cnt_1)=0。 (cnt1cnt2)+(cnt2cnt1)=0

所 以 , 我 们 能 够 得 出 结 论 。 所以,我们能够得出结论。

接下来

对 于 每 一 个 矩 阵 B , 我 们 首 先 考 虑 能 否 将 B 直 接 修 改 成 A 。 对于每一个矩阵B,我们首先考虑能否将B直接修改成A。 BBA

当 矩 阵 A 和 矩 阵 B 不 相 同 的 点 的 数 量 ≤ ⌊ n ⋅ m 2 ⌋ 时 , 我 们 可 以 这 样 构 造 。 当矩阵A和矩阵B不相同的点的数量\le \lfloor\frac{n·m}{2}\rfloor时,我们可以这样构造。 AB2nm

当 不 相 同 的 点 的 数 量 > ⌊ n ⋅ m 2 ⌋ 时 , 当不相同的点的数量> \lfloor\frac{n·m}{2}\rfloor时, >2nm

利 用 上 述 结 论 , 我 们 可 以 把 B 变 换 成 A 的 ′ ′ 反 ′ ′ 矩 阵 , 即 将 A 的 所 有 ′ X ′ 变 成 ′ . ′ , 所 有 ′ . ′ 变 成 ′ X ′ , 利用上述结论,我们可以把B变换成A的''反''矩阵,即将A的所有'X'变成'.',所有'.'变成'X', BAAX..X

这 样 的 矩 阵 。 此 时 不 同 点 的 数 量 将 会 ≤ ⌊ n ⋅ m 2 ⌋ 。 这样的矩阵。此时不同点的数量将会\le \lfloor\frac{n·m}{2}\rfloor。 2nm

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>

using namespace std;

const int N = 1010;
int n, m;
char A[N][N], B[N][N];

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++) scanf("%s",A[i]);
    for(int i=0;i<n;i++) scanf("%s",B[i]);
    int cnt = 0;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            if(A[i][j]!=B[i][j])
                cnt++;
    if(cnt<=n*m/2)
        for(int i=0;i<n;i++) printf("%s\n",A[i]);
    else
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
                if(A[i][j]=='.') putchar('X');
                else putchar('.');
            puts("");
        }
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值