思路:考虑一个二元关系(点,雷),要想到我们把整张图取反后,这个二元关系的个数是不变的
想到这点这题其实就已经过了。
我们计算一下图A和图B两张图不同的个数有多少个,如果少于一半,那么B可以变成A,所以输出A即可。
如果大于一半呢?我们知道取反后二元组个数是不变的。
所以我们对A进行取反,这样子,现在不同的个数就是没取反时候相同的个数,是小于一半的,并且满足要求,因此只需要输出A的补图即可。
#include<bits/stdc++.h>
using namespace std;
char s[1<<10][1<<10],t[1<<10][1<<10];
int main(){
int n,m;cin>>n>>m;
for(int i=0;i<n;i++) cin>>s[i];
for(int i=0;i<n;i++) cin>>t[i];
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
ans+=s[i][j]!=t[i][j];
}
}
if(ans<=n*m/2)
for(int i=0;i<n;i++) cout<<s[i]<<endl;
else
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(s[i][j]=='X') putchar('.');
else putchar('X');
}
cout<<endl;
}
return 0;
}