设一个空格子周围有 x x x颗雷,那么这个格子的数字是 x x x
此时如果把周围的 x x x颗雷变成空格子,原来的空格子变成雷
那么中间的雷(原来的空格子)会给周围的 x x x个空格子(原来的雷),每个贡献 1 1 1
从这个角度来看,原图和补图的数字是相等的
这启示我们把 B B B变成 A A A或者 A A A的补图即可
转化次数一定有一个小于一半,所以一定有解
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+10;
char a[1009][1009],b[1009][1009];
int n,m,t;
int main()
{
cin >> n >> m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin >> a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin >> b[i][j];
int ans = 0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if( a[i][j]!=b[i][j] ) ans++;
}
if( ans<=n*m/2 )
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout << a[i][j];
cout << endl;
}
}
else
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if( a[i][j]=='.' ) cout << 'X';
else cout << ".";
}
cout << endl;
}
}
}