目录
C:Sum of log https://blog.csdn.net/m0_50623076/article/details/111565108
B. Mine Sweeper II
大致题意:
给你一个n×m的矩阵,X代表雷,.代表没有雷。扫雷的游戏。为X的点权值为0,为.的点权值为相邻八个的是雷(X)的数目(当然,如果如果在该矩阵边缘的话不是八个)。
现在给你两个图A和图B,求得再不超过nm/2次数修改B(.->X 或则X->.)使得sum与A得相同。
思路:
求B得sum和A的相同,如果只是这样记录,bfs等等进行求解的话,很难做到。因为你修改一个影响到了八个,并且不仅仅是X->. 还有.->X。既然可以修改近一半的点,是不是可以考虑下直接让B为A的方法?(样例不是这样,引导你不这样想,巨坑!)。如果字符不同的个数小于等于nm/2的话就可以。X和.是相互作用的(啥意思呢?就是说如果.得1证明周围有X,那么这个X周围也有一个.)。换句话说,如果一个图的X全部变成了.,而.全部变成X,这样的话sum不变。如果B变到A需要大于nm/2的话,变到A经过上述转换的就小于nm/2了(因为之前对A变的对经过转化后的A不再变化)。
代码:
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 1e3+50;
char a[maxn][maxn] ,b[maxn][maxn];
int main(){
int n,m;
cin >> n >> m;
for(int i = 0;i < n;i++) scanf("%s",a+i);
for(int i = 0;i < n;i++) scanf("%s",b+i);
int cnt = 0;
for(int i = 0;i < n;i++)
for(int j = 0;j < m;j++)
if(a[i][j] != b[i][j]) cnt++;
if(cnt > n*m/2){
for(int i = 0;i < n;i++)
for(int j = 0;j < m;j++)
if(a[i][j] ==