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"翻转成"."),该矩阵的值不变;
    1. 若矩阵A与矩阵B元素相差的个数小于cnt个,那么可以直接输出A矩阵,因为B矩阵可以直接转换成矩阵A;
    2. 反之,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(思维构造)的主要内容,如果未能解决你的问题,请参考以下文章

2019上海icpc区域赛补题

ICPC2019上海区域赛 部分题解(正在更新)

(ICPC)亚洲区域赛上海 M.Gitignore(模拟,map)

Digit sum (第 44 届 ACM/ICPC 亚洲区域赛(上海)网络赛)进制预处理水题

(ICPC)亚洲区域赛(上海)Mine Sweeper II(思维)

第 46 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海),签到题6题