返回 课程

信奥AC之路-2级

0% 完成
0/0 步骤
  1. 第一课:字符
    5 主题|小节
  2. 第二课 嵌套循环与矩形图案(一)
    4 主题|小节
  3. 第三课 嵌套循环与矩形图案(二)
    3 主题|小节
  4. 第四课:矩形三
    5 主题|小节
  5. 第五课:字符矩形
    7 主题|小节
  6. 第六课:直角三角形
    6 主题|小节
  7. 第七课:倒三角形
    7 主题|小节
  8. 第八课:字符三角形
    8 主题|小节
  9. 第九课:字符倒三角形
    7 主题|小节
  10. 第十课:平行四边形
    6 主题|小节
  11. 第十一课:字符直角三角形
    5 主题|小节
  12. 第十二课:左斜三角形
    6 主题|小节
  13. 第十三课:等腰三角形
    6 主题|小节
  14. 第十四课:倒置等腰三角形
    7 主题|小节
  15. 第十五课:上下对称图形
    4 主题|小节
  16. 第十六课:复杂对称图形
    5 主题|小节
  17. 第十七课:左右对称图形
    5 主题|小节
  18. 第十八课:空心图形
    5 主题|小节
  19. 第十九课:空心图形
    3 主题|小节
  20. 第二十课:嵌套应用
    4 主题|小节
  21. 第二十一课:嵌套应用二
    4 主题|小节
  22. 第二十二课:嵌套应用三
    3 主题|小节
  23. 第二十三课:嵌套应用四
    3 主题|小节
课 16, 主题|小节 4
进行中

16.4 六边形图案实验

2026年1月16日
课 进展
0% 完成

16.4.1 上宽下窄六边形

题目描述:输入一个正整数n,输出一个由字符’A’组成的六边形,其顶部和底部为水平边,n表示六边形中间部分的高度。

样例输入

3

样例输出

  AAA
 AAAAA
AAAAAAA
 AAAAA
  AAA

代码实现(方法一)

int n;
cin>>n;  // 读入六边形中间部分的高度n

// 打印六边形的上半部分(增宽三角形)
for(int i=1;i<=n;i++){
    // 打印每行前面的空格,随着i增大而减少
    for(int j=1;j<=n-i;j++){
        cout<<' ';
    }
    // 打印每行的字符'A',使用特殊公式n+(i-1)*2计算宽度
    for(int j=1;j<=n+(i-1)*2;j++){
        cout<<'A';
    }
    cout<<endl;  // 换行
}

// 打印六边形的下半部分(减窄三角形)
for(int i=n-1;i>=1;i--){
    // 打印每行前面的空格,与上半部分镜像
    for(int j=1;j<=n-i;j++){
        cout<<' ';
    }
    // 打印每行的字符'A',宽度与上半部分对应行相同
    for(int j=1;j<=n+(i-1)*2;j++){
        cout<<'A';
    }
    cout<<endl;  // 换行
}

代码实现(方法二)

int n;
cin>>n;  // 读入六边形中间部分的高度n

// 打印六边形的上半部分(增宽三角形)
for(int i=1;i<=n;i++){
    // 打印每行前面的空格,随着i增大而减少
    for(int j=1;j<=n-i;j++){
        cout<<' ';
    }
    // 打印每行的字符'A',使用特殊公式n+(i-1)*2计算宽度
    for(int j=1;j<=n+(i-1)*2;j++){
        cout<<'A';
    }
    cout<<endl;  // 换行
}

// 打印六边形的下半部分(减窄三角形),使用不同的循环方式
for(int i=2;i<=n;i++){
    // 打印每行前面的空格,使用不同的计算方式
    for(int j=1;j<=i-1;j++){
        cout<<' ';
    }
    // 打印每行的字符'A',使用不同的计算公式
    for(int j=1;j<=n+(n-i)*2;j++){
        cout<<'A';
    }
    cout<<endl;  // 换行
}

思考

  • 这个六边形有一个特点:字符数量的计算公式比之前的图形更复杂
  • 字符数量 = n+(i-1)*2,这使得六边形的两侧呈斜线状
  • 上半部分:空格数递减,字符数递增
  • 下半部分:有两种实现方式
    • 方法一:直接使用与上半部分镜像的循环结构
    • 方法二:使用不同的计算公式,字符数为n+(n-i)*2
  • 这种结构创建了一个标准的六边形,上下完全对称

16.4.2 上窄下宽六边形

题目描述:输入一个正整数n,输出一个由字符’A’组成的倒置六边形,其两侧为垂直边,n表示六边形中间部分的高度。

样例输入

3

样例输出

AAAAAAA
 AAAAA
  AAA
 AAAAA
AAAAAAA

代码实现(方法一)

int n;
cin>>n;  // 读入六边形中间部分的高度n

// 打印六边形的上半部分(减窄三角形)
for(int i=n;i>=1;i--){
    // 打印每行前面的空格,随着i减小而增加
    for(int j=1;j<=n-i;j++){
        cout<<' ';
    }
    // 打印每行的字符'A',数量随i减小而减少
    for(int j=1;j<=n+(i-1)*2;j++){
        cout<<'A';
    }
    cout<<endl;  // 换行
}

// 打印六边形的下半部分(增宽三角形)
for(int i=2;i<=n;i++){
    // 打印每行前面的空格,随着i增大而减少
    for(int j=1;j<=n-i;j++){
        cout<<' ';
    }
    // 打印每行的字符'A',数量随i增大而增加
    for(int j=1;j<=n+(i-1)*2;j++){
        cout<<'A';
    }
    cout<<endl;  // 换行
}

代码实现(方法二)

int n;
cin>>n;  // 读入六边形中间部分的高度n

// 打印六边形的上半部分(减窄三角形),使用不同的循环方式
for(int i=1;i<=n;i++){
    // 打印每行前面的空格,随着i增大而增加
    for(int j=1;j<=i-1;j++){
        cout<<' ';
    }
    // 打印每行的字符'A',使用不同的计算公式
    for(int j=1;j<=n+(n-i)*2;j++){
        cout<<'A';
    }
    cout<<endl;  // 换行
}

// 打印六边形的下半部分(增宽三角形)
for(int i=2;i<=n;i++){
    // 打印每行前面的空格,随着i增大而减少
    for(int j=1;j<=n-i;j++){
        cout<<' ';
    }
    // 打印每行的字符'A',数量随i增大而增加
    for(int j=1;j<=n+(i-1)*2;j++){
        cout<<'A';
    }
    cout<<endl;  // 换行
}

思考

  • 这个倒置六边形与上一个实验相反:最宽的部分在上下两端,中间最窄
  • 方法一:
    • 上半部分:i从n递减到1,空格数递增,字符数递减
    • 下半部分:i从2递增到n,空格数递减,字符数递增
  • 方法二:
    • 上半部分:使用不同的计算方式,字符数为n+(n-i)*2
    • 下半部分:与方法一相同
  • 注意上下两部分的连接处,避免中间行重复
  • 这种结构创建了一个倒置的六边形,形状与上一个实验正好相反