CF1495C题解

· · 题解

题解思路:

我们就第一行全填上 X, 第二行让 X 联通, 第三行全填 X

这样我们会发现每 3 个一个周期。

但题目给出了在一个 X 的八个方向上是没有 X 的。

有了这个条件后,那么我们填好后,那么每三个就是一个连通块。

但上下之间没有贯穿。

若原来有 X 就选最少的就可以了,若原来没有 X,那么就随便开出一条就可以了。

注意:最后一行直接打穿上去就行了。

AC CODE:

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 510;
int T;
char a[N][N]; 
int main() {
    scanf ("%d" , &T);
    while (T --) {
        int n , m;
        scanf ("%d%d" , &n , &m);
        for (int i = 0; i < n; ++ i)
            for (int j = 0; j < m; ++ j)
                cin >> a[i][j];
        for (int i = 0; i < n; ++ i) {
            bool ok = true;
            for (int j = 0; j < m; ++ j) {
                if (i % 3 == 0) {//是三的倍数的行,就把他填成X 
                    a[i][j] = 'X';
                    if (ok && a[i - 1][j] == 'X'){//把他从上面连上,变联通 
                        a[i - 1][j] = a[i - 2][j] = 'X';
                        ok = false;
                    }
                    if (ok && i > 1 && a[i - 2][j] == 'X') {//同上 
                        a[i - 1][j] = a[i - 2][j] = 'X';
                        ok = false;
                    } 
                }else if (i == n - 1) {
                    if (a[i][j] == 'X')//最后一行的情况 
                        if (i > 0)
                            a[i - 1][j] = 'X';
                }
            }
            if (ok && i % 3 == 0 && i > 0) {//其他地方没有X随便建一条。
                a[i - 1][0] = a[i - 2][0] = 'X'; 
            }
        }
        for (int i = 0; i < n; ++ i) {
            for (int j = 0; j < m; ++ j)
                cout << a[i][j];
            puts("");
        }
    }
    return 0;
}