题目链接:http://codeforces.com/gym/102900/problem/B
题意:扫雷游戏,X表示雷,.表示无雷区,每个无雷区上面有一个数字,记录该位置处周围8个位置有多少个雷。现在给出A矩阵雷区和B矩阵雷区,它们无雷区数字之和为suma,sumb,要求(int)(nm/2)次将B矩阵雷区变化成sumb=suma
解题思路:
首先要找到一个规律就是,将一个矩阵的雷区全部变成无雷区,无雷区全部变为雷区,最后得到的sum相同。
然后去找A矩阵与B矩阵每一个位置处不同的数量cnt,如果cnt<=(int)(nm/2),则直接输出A矩阵即可。如果cnt>(int)(nm/2),则先将A矩阵变换为相反的矩阵,然后得到的cnt一定小于等于(int)(nm/2),所以直接输出A的变化矩阵即可
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<math.h>
#include<string.h>
#include<string>
using namespace std;
#define ll long long
const int mod = 1e9 + 7;
int n, m;
char a[1100][1100];
char b[1100][1100];
int maxt;
int cnt;
int main() {
scanf("%d%d", &n, &m);
maxt = n * m / 2;
for (int i = 0; i < n; i++)
scanf("%s", a[i]);
for (int i = 0; i < n; i++)
scanf("%s", b[i]);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] != b[i][j])
cnt++;
}
}
if (cnt <= maxt) {
for (int i = 0; i < n; i++)
printf("%s\n", a[i]);
}
else {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] == '.')
printf("X");
else
printf(".");
}
printf("\n");
}
}
return 0;
}