本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2022-04-17 19:10:42
题解思路:
我们就第一行全填上 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;
}

鲁ICP备2025150228号