题意: 给定两个
n
×
m
n\times m
n×m的初始扫雷阵
A
A
A,
B
B
B,每个阵的分数为所有非雷块的分数之和,每个非雷块的分数为以其为九宫格中心的九宫格中的雷块数量。现在问在不超过
⌊
n
m
2
⌋
\lfloor\frac{nm}{2}\rfloor
⌊2nm⌋次翻转后,使得操作后的
B
B
B的分数等于
A
A
A的分数。
数据范围:
1
≤
n
,
m
≤
1000
1\leq n,m\leq 1000
1≤n,m≤1000
题解:
!
A
!A
!A定义为将
A
A
A全部翻转,即
A
A
A的所有雷块变为非雷块,非雷块变为雷块。
定义
B
→
A
B→A
B→A的转换次数为
c
n
t
cnt
cnt
则
B
→
!
A
B→!A
B→!A的转换次数为
n
×
m
−
c
n
t
n\times m-cnt
n×m−cnt
若
c
n
t
≤
n
×
m
2
,
cnt \leq \frac{n \times m}{2},
cnt≤2n×m, 转换成
A
A
A
若
c
n
t
>
n
×
m
2
,
cnt > \frac{n \times m}{2},
cnt>2n×m, 则
n
×
m
−
c
n
t
<
=
n
×
m
2
n \times m - cnt <= \frac{n \times m}{2}
n×m−cnt<=2n×m,转换成
!
A
!A
!A
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
char A[N][N], B[N][N];
int n, m;
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) scanf("%s", A[i] + 1);
for(int i = 1; i <= n; ++i) scanf("%s", B[i] + 1);
int mx = n * m / 2;
int cnt = 0;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
cnt += (A[i][j] != B[i][j]);
if(cnt <= mx) {
for(int i = 1; i <= n; ++i) puts(A[i] + 1);
}
else {
for(int i = 1; i <= n; ++i, putchar('\n'))
for(int j = 1; j <= m; ++j)
putchar(A[i][j] == 'X' ? '.' : 'X');
}
return 0;
}