LINK

设一个空格子周围有 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;
		}		
	}
}