题解:CF1950B Upscaling

· · 题解

更好的阅读体验

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

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

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

#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;
}