返回 课程

信奥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 主题|小节
课 17, 主题|小节 4
进行中

17.4 复杂左右对称图形实验

2025年12月1日
课 进展
0% 完成

17.4.1 花瓣形状

题目描述:输入一个正整数n,输出一个花瓣形状,由n个并排的等腰三角形组成。

样例输入

3

样例输出

  A      A      A
 AAA    AAA    AAA
AAAAA  AAAAA  AAAAA

代码实现

int n;
cin>>n;  // 读入花瓣数量n

for(int i=1;i<=n;i++){  // 外循环控制行数
    for(int k=1;k<=n;k++){  // 中间循环控制花瓣数量,循环n次生成n个并排的三角形
        // 打印每个三角形前的空格,数量为n-i
        for(int j=1;j<=n-i;j++){
            cout<<' ';
        }
        
        // 打印三角形的'A',数量为i*2-1(奇数序列)
        for(int j=1;j<=i*2-1;j++){
            cout<<'A';
        }
        
        // 打印每个三角形后的空格,数量为n-i,保持三角形间的距离
        for(int j=1;j<=n-i;j++){
            cout<<' ';
        }
    }
    
    cout<<endl;  // 每行结束后换行
}

思考

  • 这个图案更为复杂,包含三层嵌套循环
  • 最外层循环i控制行数
  • 中间层循环k控制并排三角形的数量,从1到n
  • 最内层循环有三组,分别控制每个三角形的前导空格、字符和后置空格
  • 每个三角形的结构与前面实验中的等腰三角形相同
  • 这种结构创建了一个由n个等腰三角形组成的花瓣形状,整体左右对称

17.4.2 蝴蝶形状的上下对称变体

题目描述:输入一个正整数n,输出一个具有上下和左右对称性的蝴蝶形状。

样例输入

3

样例输出

A    A
AA  AA
AAAAAA
AA  AA
A    A

代码实现

int n;
cin>>n;  // 读入n,表示上半部分的行数

// 打印蝴蝶的上半部分(上宽下窄)
for(int i=1;i<=n;i++){
    // 打印左侧字符'A',数量随着i增加而增加
    for(int j=1;j<=i;j++){
        cout<<'A';
    }
    
    // 打印中间的空格,数量为2*(n-i),随着i增加而减少
    for(int j=1;j<=2*(n-i);j++){
        cout<<' ';
    }
    
    // 打印右侧字符'A',数量与左侧相同
    for(int j=1;j<=i;j++){
        cout<<'A';
    }
    
    cout<<endl;  // 每行结束后换行
}

// 打印蝴蝶的下半部分(上窄下宽),镜像上半部分
for(int i=n-1;i>=1;i--){
    // 打印左侧字符'A',数量随着i减小而减少
    for(int j=1;j<=i;j++){
        cout<<'A';
    }
    
    // 打印中间的空格,数量为2*(n-i),随着i减小而增加
    for(int j=1;j<=2*(n-i);j++){
        cout<<' ';
    }
    
    // 打印右侧字符'A',数量与左侧相同
    for(int j=1;j<=i;j++){
        cout<<'A';
    }
    
    cout<<endl;  // 每行结束后换行
}

思考

  • 这个图案结合了左右对称和上下对称的特性
  • 上半部分是一个上宽下窄的蝴蝶形(与实验一相同)
  • 下半部分是上半部分的镜像,使用i从n-1递减到1的循环
  • 整个结构形成了一个完全对称的蝴蝶形状
  • 注意上下部分的连接处不重复中间行
  • 这种图案展示了如何结合左右对称和上下对称创建更复杂的图形