分析:

本题可以将该图案拆分成上下两部分,对于上半部分设置space,star变量记录空格和星号的个数,然后对应自增和自减,然后补全后面的空格公式可以写成2*n+1-space-star。
下半部分同理,重置space和star变量,然后对于自增和自减,补全空格输出即可。

题解:

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

int main() {
    int n = 0;
    //循环读入n
    while(scanf("%d", &n) != EOF) {
        //设置space,star值的初始值
        int space = 2*n;
        int star = 1;
        //外循环开始遍历每一行
        for(int i = 0; i < n+1; ++i) {
            //挨个输出空格的个数
            for(int j = 0; j < space; ++j)
                printf(" ");
            //挨个输出星号的个数
            for(int j = 0; j < star; ++j)
                printf("*");
            //输出剩下的空格
            for(int j = 0; j < 2*n+1-space-star; ++j)
                printf(" ");
            //更新下一行的空格数和星号个数
            space -= 2;
            star += 1;
            printf("\n");
        }

        //下半部分的初值设置
        space = 2;
        star = n;
        //外循环开始遍历每一行,内循环流程和上述一样
        for(int i = 0; i < n; ++i) {
            for(int j = 0; j < space; ++j)
                printf(" ");
            for(int j = 0; j < star; ++j)
                printf("*");
            for(int j = 0; j < 2*n+1-space-star; ++j)
                printf(" ");
            //更新下一行的空格和星号个数
            space += 2;
            star -= 1;
            printf("\n");            
        }
    }
    return 0;
}

总结:

复杂图案的绘制,分而治之,找出每行的规律使用循环控制即可。