AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 校园
  • 应用
  • 文章
    • 题解
    • 分享
    • 问答
  • 吐槽
  • 登录/注册

AcWing 727. 菱形    原题链接    困难

作者: 作者的头像   ACER01 ,  2022-06-23 23:59:32 ,  所有人可见 ,  阅读 16


0


用了一个比较笨的总结数学规律的方法实现的,大致思路如下:
根据题目可知这是一个上下对称的图形,最中间的一行 * 的个数为输入的层数,整个图形可以理解为以输入层数为边长的正方形,空格和 * 分别占每一行的一个单位,每一行共n个单位,当输出的第x层为最中间时,的个数为n个,并且我们发现第一层为1个,第二层为3个,也就是随着层数,的个数为加2的等差数列。那么每一层两侧分别的空格数为n减去所在层数的数除以2,所在层数的数可以通过循环来建立等差数列进行计算。

#include<iostream>
#include<cstdio>

using namespace std;

int main()
{
    int n,num;  \\ n 为层数,num为最中间*的个数
    cin >> n;
    num = n;
    int m; \\ m为下班部分图形的代换层数
    if(n == 1) \\ 当n为1时不存在上下两个对称部分,所以单独列出
    {
        cout << "*" <<endl;
        return 0;
    }
    for(int i = 1 ; i < n; ) \\ 上半层 * 的个数来循环直到中间层
    {
        m = i; \\ 让m在最后获取到中间层上一层的*数
        for (int  j = 1; j <= (num - i) / 2; j++ ) \\ 计算每一行前半部分的空格数
        {
            cout << " ";
        }
        for (int  k = (num - i) / 2 + 1; k <= n - (num - i) /2; k++)  
        \\  从前半部分的空格数结束之后的后一个位置开始循环,直到*的最后一个位置结束
        \\ (num - i)/2为后半部分空格的数量,由n减去后半部分空格数量则为*的最后位置
        {
            cout<< "*";
        }
        for(int z = n - (num - i) / 2 + 1; z <= n; z ++)
        \\ 从*结束的后一个位置开始循环输出空格,直到空格和*的总数达到n
        {
            cout << " ";
        }
        cout << endl;
        i = i + 2;
    }
    for(int j = 0; j < n; j++) \\ 循环输出最中间层的*
    {
        cout << "*";
    }
    cout << endl;
    for(int i = m; i >= 0;) 
    \\ 因为下半部分图形是上半部分的对称,所以采取反方向递减来输出,让下半层第一层的点数从中间层上一层的点数开始递减
    {
        \\ 空格和*的计算输出方式和上半层一样,主要通过层数和*数来影响
        for (int  j = 1; j <= (num - i) / 2; j++ )
        {
            cout << " ";
        }
        for (int  k = (num - i) / 2 + 1; k <= n - (num - i) /2; k++)
        {
            cout<< "*";
        }
        for(int z = n - (num - i) / 2 + 1; z <= n; z ++)
        {
            cout << " ";
        }
        cout << endl;
        i = i - 2;  \\ 以每层减少2 * 来递减
    }

    return 0;
}

第一次写题解,写的有点儿乱,见谅。


0 评论

你确定删除吗?

© 2018-2022 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息