1 条题解

  • 0
    @ 2026-5-16 22:57:51

    1950B - 升级 详细题解(标程版)

    题意简述

    给定 nn,输出一个大小为 2n×2n2n \times 2n 的图案。 图案由 2×22 \times 2 块构成,黑白(#/.)交替排列,左上角为 #


    标程核心思路(最优解法)

    直接观察 2n×2n2n \times 2n 里的每一个位置 (x,y)(x,y)

    1. 把坐标向下取整除以 2,得到缩小后的坐标:
    $$\Big(\left\lfloor \frac{x}{2} \right\rfloor,\ \left\lfloor \frac{y}{2} \right\rfloor\Big) $$
    1. 如果这两个数的和是偶数 → 输出 #
    2. 如果和是奇数 → 输出 .

    最终公式(标程唯一公式):

    $$\text{if} \ \left\lfloor \frac{x}{2} \right\rfloor + \left\lfloor \frac{y}{2} \right\rfloor \ \text{is even} \ \Rightarrow \ \texttt{\#} $$else  .\text{else} \ \Rightarrow \ \texttt{.}

    详细构造规则

    2n×2n2n \times 2n 网格中每一个格子 (x,y)(x,y)(从 00 开始或从 11 开始都可以):

    • 计算 nx=x/2nx = x / 2(整数除法,向下取整)
    • 计算 ny=y/2ny = y / 2(整数除法,向下取整)
    • 如果 nx+nynx + ny 是偶数 → #
    • 否则 → .

    标程完整 AC 代码

    #include <iostream>
    using namespace std;
    
    int main() {
        int t;
        cin >> t;
        while (t--) {
            int n;
            cin >> n;
            int size = n * 2;
            
            for (int i = 0; i < size; i++) {
                for (int j = 0; j < size; j++) {
                    int x = i / 2;
                    int y = j / 2;
                    if ((x + y) % 2 == 0) cout << '#';
                    else cout << '.';
                }
                cout << '\n';
            }
        }
        return 0;
    }
    

    代码解释(完全对标标程)

    1. 输入 tt 组测试用例
    2. 对每个 nn,图案大小为 2n×2n2n \times 2n
    3. 遍历每个位置 (i,j)(i,j)
    4. 计算缩小坐标 x=i/2, y=j/2x=i/2,\ y=j/2
    5. x+yx+y 偶 → #,奇 → .
    6. 输出图案

    时间复杂度

    O(t(2n)2)O(t \cdot (2n)^2),完全满足题目限制。


    样例对照

    • n=1n=12×22\times2
      ##
      ##
      
    • n=2n=24×44\times4
      ##..
      ##..
      ..##
      ..##
      

    完全符合标程输出。

    • 1

    信息

    ID
    7141
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者