题解:学而思编程 打印金字塔图案

【题目来源】

学而思编程:打印金字塔图案

【题目描述】

给定一个整数 \(n\),请你打印一个具有 \(n\) 层结构的金字塔图案。

例如当 \(n = 2\) 时的三角形金字塔图案如下:

\(n = 3\) 时的三角形金字塔图案如下:

【输入】

一行一个整数 \(n\)

【输出】

输出对应的金字塔图案。

【输入样例】

4

【输出样例】

       /\
      /__\
     /\  /\
    /__\/__\
   /\  /\  /\
  /__\/__\/__\
 /\  /\  /\  /\
/__\/__\/__\/__\

【核心思想】

  1. 问题分析:给定整数 \(n\),打印 \(n\) 层金字塔图案。每层包含上下两行:上行是 /\ 重复 \(i\) 次,下行是 /__\ 重复 \(i\) 次,且随着层数增加,前导空格减少。这是一个嵌套循环 + 格式控制问题,关键在于计算每行的前导空格数和重复单元数。

  2. 算法选择

    • 外层循环控制层数:遍历 \(i\)\(1\)\(n\)
    • 内层循环控制空格与图案:每层打印两行,分别计算前导空格和重复单元
  3. 关键步骤

    • 初始化:读取 \(n\)
    • 逐层打印(遍历 \(i\)\(1\)\(n\)):
      • 打印上行
        • 前导空格:2 * (n - i) 个空格
        • 图案单元:" /\\ " 重复 \(i\)
        • 换行
      • 打印下行
        • 前导空格:2 * (n - i) 个空格
        • 图案单元:"/__\\" 重复 \(i\)
        • 换行
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n^2)\),共 \(2n\) 行,每行 \(O(n)\) 字符
    • 空间复杂度:\(O(1)\),仅输出,无额外存储
  5. 格式控制的核心思想

    • 前导空格递减:第 \(i\) 层的前导空格为 2*(n-i),随着 \(i\) 增大,空格减少,形成金字塔的缩进效果
    • 重复单元递增:第 \(i\) 层有 \(i\) 个三角形单元,体现金字塔的宽度增长
    • 上下行配对:每层包含尖顶行(/\)和底边行(/__\),共同构成完整三角形
    • 转义字符处理\ 在 C++ 字符串中需转义为 \\
    • 适用于"规则图案打印"类问题,通过分析图案规律,用循环控制空格和重复单元即可实现

【算法标签】

模拟

【代码详解】

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;  // 层数
    cin >> n;

    for (int i = 1; i <= n; i++)  // 第i层
    {
        // 打印前导空格
        for (int j = 1; j <= 2 * (n - i); j++)
        {
            cout << " ";
        }
        // 打印上层三角形
        for (int j = 1; j <= i; j++)
        {
            cout << " /\\ ";
        }
        cout << endl;

        // 打印下一行的前导空格
        for (int j = 1; j <= 2 * (n - i); j++)
        {
            cout << " ";
        }
        // 打印下层三角形
        for (int j = 1; j <= i; j++)
        {
            cout << "/__\\";
        }
        cout << endl;
    }
    return 0;
}

【运行结果】

4
       /\
      /__\
     /\  /\
    /__\/__\
   /\  /\  /\
  /__\/__\/__\
 /\  /\  /\  /\
/__\/__\/__\/__\
posted @ 2026-07-05 14:34  团爸讲算法  阅读(5)  评论(0)    收藏  举报