P9820 [ICPC2020 Shanghai R] Mine Sweeper II
题目大意
给定两张
结论
定义一个图
将
证明
对于相邻的两个格子:
- 若其中一个为地雷格,另外一个为非地雷格,则它的贡献为
1 ,反转后的贡献也为1 ,所以它们的贡献相同。 - 若两个格子相同,则它们的贡献均为
0 ,也相同。
综上,任意两个相邻的格子都可以取反,取反后贡献不变。
因此,
- 将
B 改为A 或A 的反地图A_2 所需的修改次数不大于\lfloor \dfrac{nm}{2} \rfloor 。
设
因为
那么题目可化为证明
所以将
代码
#include<bits/stdc++.h>
using namespace std;
int getbomb(){
char bomb;
cin>>bomb;
if(bomb=='X') return 1;
else return 0;
}
void outbomb(bool b){
if(b) cout<<"X";
else cout<<".";
}
bool a[1002][1002];
int main(){
int n,m;
cin>>n>>m;
int k=0;
for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) a[i][j]=getbomb();
for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) if(getbomb()!=a[i][j]) k++;
if(k<=n*m/2){
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++) outbomb(a[i][j]);
cout<<"\n";
}
}
else{
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++) outbomb(!a[i][j]);
cout<<"\n";
}
}
return 0;
}