题解 - CF1950B Upscaling

Luogu

题目要求根据给定的整数 $n$,输出一个 $2n \times 2n$ 的棋盘,其中每个 $2 \times 2 $的小方块交替使用 # 和 . 构成。

模拟即可,用一个 flag 表示当前应该使用 # 还是 .,使用两层循环来生成棋盘,每次循环是,先根据 flag 的值输出当前行的两个方块,然后翻转 flag 的值,以便下一行使用相反的符号。

每输出完一行,根据 $n$ 的奇偶性来更新 flag 的值,使得下一行的开头与当前行的结尾相反即可,时间复杂度为 $O(n^2)$。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <bits/stdc++.h>
using namespace std;

int main() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
bool flag = true;

for (int i = 0; i < 2 * n; i += 2) {
for (int j = 0; j < 2 * n; j += 2) {
if (flag)
cout << "##";
else
cout << "..";
flag = !flag;
}
cout << endl;

if (n % 2)
flag = !flag;

for (int j = 0; j < 2 * n; j += 2) {
if (flag)
cout << "##";
else
cout << "..";
flag = !flag;
}
cout << endl;

if (n % 2 == 0)
flag = !flag;
}
}
return 0;
}