top1编程
← 返回题目
题解

【基础】空心六边形-2

1 条题解

  • 0
    @ 2026-7-31 10:25:45

    解题思路

    题目要求打印一个空心的正六边形。拿 n=5 来看:

        *****
       *     *
      *       *
     *         *
    *           *
     *         *
      *       *
       *     *
        *****
    

    一共 2n-1 = 9 行,中间行是第 n 行。

    找规律:先算这一行到中间行的距离 d,例如:

    • 第 1 行 d=4,第 2 行 d=3,…… 中间行 d=0,然后又开始变大

    每一行的结构:

    • 左边星在位置 d
    • 右边星在位置 3×(n-1) - d
    • 第一行和最后一行是整排星(n 个)
    • 其他行只有左右两端各一个星,中间是空格

    右边星为什么是 3(n-1)-d? 因为最宽处(中间行)右边星在 2n-2 列,左边星在 0 列,随着远离中间行两边各往中间收。

    参考代码

    #include <iostream>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
    
        int total = 2 * n - 1;  // 总行数
        int mid = n - 1;        // 中间行的行号
    
        for (int i = 0; i < total; i++) {
            // 距离中间行的距离
            int d = i - mid;
            if (d < 0) d = -d;
            // 左边星的位置
            int left = d;
            // 右边星的位置
            int right = 3 * mid - d;
    
            for (int j = 0; j <= right; j++) {
                if (j < left) {
                    // 左边是空格
                    cout << ' ';
                } else if (i == 0 || i == total - 1 || j == left || j == right) {
                    // 首末行或两端画星
                    cout << '*';
                } else {
                    cout << ' ';
                }
            }
            cout << endl;
        }
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N²),每行打印的字符数约等于 n²
    • 空间复杂度:O(1)
    • 1