解题思路
题目链接
题目中说修改次数不能够超过$n * m / 2$,也就是一半的格子
我们只需统计A图和B图中的差异单元格个数,
如果差异小于一半,直接原样输出图A即可
否则:
我们要用到雷与空格有一个关键的性质:取反之后单元格内的数字总和仍旧不变
如何理解这个性质?
此时如果把周围的 x 颗雷变成空格子,原来的空格子变成雷
那么中间的雷(原来的空格子)会给周围的 x 个空格子(原来的雷),每个贡献1
从这个角度来看,原图和补图的数字是相等的
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m;
char a[N][N], b[N][N];
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++) cin >> 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++) cout << a[i] << endl;
else
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
if (a[i][j] == '.') cout << 'X';
else cout << '.';
cout << endl;
}
}
return 0;
}