Logo FiraCode 的博客

博客

CF1495C题解

...
FiraCode
2025-12-01 12:55:18
什么意思呢

本文章由 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;
}

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。