ICPC2021上海区域赛 B.Mine Sweeper II(思维构造)
Posted K2MnO4
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ICPC2021上海区域赛 B.Mine Sweeper II(思维构造)相关的知识,希望对你有一定的参考价值。
- 题目:Mine Sweeper II
- 题意:"."代表该位置八个方向(北、东北、东、东南、南、西南、西、西北)\'X\'的个数,给出矩阵A(n * m),矩阵B(n * m),问B矩阵最多翻转cnt = (n * m) / 2次是否可以满足其矩阵值("."的值之和) = 矩阵A的值,不能满足则输出"-1", 可以满足则输出翻转后的矩阵B.
- 解析:首先,需要发现一个规律,就是矩阵A的逆(将"*"翻转成"X","X"翻转成"."),该矩阵的值不变;
- 若矩阵A与矩阵B元素相差的个数小于cnt个,那么可以直接输出A矩阵,因为B矩阵可以直接转换成矩阵A;
- 反之,A的矩阵所有元素进行翻转后输出,因为A的矩阵所有元素进行翻转后的A\',此时A\'的值与A一样,但这时候A\'与B矩阵元素相差的个数就小于cnt个.
- 代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
char a[N][N], b[N][N];
int n, m, cnt = 0;
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];
if(a[i][j] != b[i][j]) cnt ++;
}
}
if(cnt <= (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] == \'.\') a[i][j] = \'X\';
else a[i][j] = \'.\';
cout << a[i][j];
}
cout << endl;
}
}
return 0;
}
以上是关于ICPC2021上海区域赛 B.Mine Sweeper II(思维构造)的主要内容,如果未能解决你的问题,请参考以下文章
(ICPC)亚洲区域赛上海 M.Gitignore(模拟,map)
Digit sum (第 44 届 ACM/ICPC 亚洲区域赛(上海)网络赛)进制预处理水题