算法笔记11:打印图案

1、打印菱形图案   

  * 
 * * 
* * * 
 * * 
  * 
#include <stdio.h>

int main()
{
    int n = 0; 
    //多组输入
    while (scanf("%d",&n)!=EOF)
    {
        //打印上半部分
        //控制行数
        for (int i = 0; i < n; i++)
        {
            //打印一行
            //打印空格
            for (int j = 0; j < n - i; j++)
            {
                printf(" ");
            }
            //打印*空格
            for (int k = 0; k <= i; k++)
            {
                printf("* ");
            }
            printf("\n");
        }
        //打印下半部分
        //控制行数
        for (int i = 0; i < n + 1; i++)
        {
            //打印一行
            //打印空格
            for (int j = 0; j < i; j++)
            {
                printf(" ");
            }
            //打印*空格
            for (int k = 0; k < n + 1 - i; k++)
            {
                printf("* ");
            }
            printf("\n");
        }
    }

    return 0;
}

        先将整个菱形图案分成上下两个部分,上半部分n行,下半部分n+1行。               

        这题的关键点在是先有空格再有的*,可以知道,输入的数字就是第一行的空格数,空格数程递减趋势,*呈递增趋势。然后因为空格和*不是交叉输出的,所以先遍历空格,再遍历*号,分开考虑。上半部分控制空格打印递减是用 n - i ,减小每次遍历的次数。

2、带空格的直角三角形图案

        * 
      * * 
    * * * 
  * * * * 
* * * * *
#include <stdio.h>

int main()
{
    int n = 0;
    //多组输入
    while (~scanf(" %d", &n))
    {
        //控制行数
        for (int i = 0; i < n; i++)
        {
            //打印一行
            for (int j = 0; j < n; j++)
            {
                if (i + j < n - 1)
                {
                    printf("  ");
                }
                else
                {
                    printf("* ");
                }
            }
            printf("\n");
        }
    }

    return 0;
}

        每一次打印两个空格,i+j 的作用是用来控制当前打印的空格数。因为j是控制内层循环,所以当i逐渐变大时,(i + j < n - 1)其中的j逐渐变小,空格打印的次数也变少。

3、金字塔图案

   * 
  * * 
 * * * 
* * * * 
#include <stdio.h>

int main()
{
    int n = 0;
    //多组输入
    while (~scanf(" %d", &n))
    {
        //控制行数
        for (int i = 0; i < n; i++)
        {
            //打印一行
            //打印空格
            for (int j = 0; j < n - 1 - i; j++)
            {
                printf(" ");
            }
            //打印*空格
            for (int k = 0; k <= i; k++)
            {
                printf("* ");
            }
            printf("\n");
        }
    }

    return 0;
}

           这题相当于是一半的菱形图案,先打印空格,再打印*,  (int j = 0; j < n - 1 - i; j++)  ,其中n-1的原因是最多只有n-1个空格,-i是为了让j在行数变大的时候打印空格的次数变少。*号最大的次数与输入的数n相等,所以<=n就行了。         

4、翻转金字塔图案

* * * * * 
 * * * * 
  * * * 
   * * 
    * 
# include <stdio.h>

int main()
{
    int n = 0; 
    //多组输入
    while (~scanf(" %d", &n))
    {
        //控制行数
        for (int i = 0; i < n; i++)
        {
            //打印一行
            //打印空格
            for (int j = 0; j < i; j++)
            {
                printf(" ");
            }
            //打印*空格
            for (int k = 0; k < n - i; k++)
            {
                printf("* ");
            }
            printf("\n");
        }
    }

    return 0;
}

        倒过来的思路就相反,空格是递增的,思路仍然是i控制行数,然后先遍历空格再遍历*,刚开始因为j与i都是0所以第一行不会输出空格。

5、K型图案

* * * 
* * 
* 
* * 
* * * 
#include <stdio.h>

int main()
{
    int n = 0;
    //多组输入
    while (~scanf(" %d", &n))
    {
        //打印上半部分
        //控制行数
        for (int i = 0; i < n; i++)
        {
            //打印一行
            //打印*空格
            for (int j = 0; j < n + 1 - i; j++)
            {
                printf("* ");
            }  
            printf("\n");
        }
        //打印下半部分
        //控制行数
        for (int i = 0; i < n + 1; i++)
        {
            //打印一行
            //打印*空格
            for (int j = 0; j <= i; j++)
            {
                printf("* ");
            }
            printf("\n");
        }
    }

    return 0;
}

         同菱形一样分为上下两个部分,因为都是从*开始,所以不用考虑空格,只用分开考虑递减和递增。假设输入的数字为2,那么第一行n+1-i就是3,打印三个*。

6、箭型图案

    *
  **
***
  **
    *
#include <stdio.h>

int main()
{
    int n = 0; 
    //多组输入
    while (scanf("%d",&n)!=EOF)
    {
        //打印上半部分
        //控制行数
        for (int i = 0; i < n; i++)
        {
            //打印一行
            //打印空格
            for (int j = 0; j < n - i; j++)
            {
                printf("  ");
            }
            //打印*空格
            for (int k = 0; k <= i; k++)
            {
                printf("*");
            }
            printf("\n");
        }
        //打印下半部分
        //控制行数
        for (int i = 0; i < n + 1; i++)
        {
            //打印一行
            //打印空格
            for (int j = 0; j < i; j++)
            {
                printf("  ");
            }
            //打印*空格
            for (int k = 0; k < n + 1 - i; k++)
            {
                printf("*");
            }
            printf("\n");
        }
    }

    return 0;
}

        跟菱形的代码一样,只不过输出两个空格,*后面没有空格。

7、反斜线图案

*   
 *  
  * 
   *
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string>//string头文件
#include <bits/stdc++.h>
#include <algorithm>//算法头文件,sort包含在内
int main()
{
    int n = 0;
    //多组输入
    while (scanf("%d",&n)!=EOF)
    {
        //控制行数
        for (int i = 0; i < n; i++)
        {
            //控制列
            for (int j = 0; j < n; j++)
            {
                //控制打印
                if (i == j)
                {
                    printf("*");
                }
                else
                {
                    printf(" ");
                }
            }
            printf("\n");
        }
    }

    return 0;
}

        因为图案列数是递增的所以让j<n,这里的思路跟打印矩阵对角线一个思路,让i与j相等的位置打印*,其余位置用空格填补。

8、正斜线图案

   *
  * 
 *  
*   
#include <stdio.h>

int main()
{
    int n = 0;
    //多组输入
    while (~scanf(" %d", &n))
    {
        //控制行数
        for (int i = 0; i < n; i++)
        {
            //控制列数
            for (int j = 0; j < n; j++)
            {
                //判断打印
                if (i + j == n - 1)
                {
                    printf("*");
                }
                else
                {
                    printf(" ");
                }
            }
            printf("\n");
        }
    }

    return 0;
}

        因为最后要打印的是*号,所以在控制位置的时候是n-1,随着i的增大,j也变小,*号位置也越近。

9、X型图案

*   *
 * * 
  *  
 * * 
*   *
#include <stdio.h>

int main()
{
    int n = 0;
    //多组输入
    while (~scanf(" %d", &n))
    {
        //控制行数
        for (int i = 0; i < n; i++)
        {
            //控制列
            for (int j = 0; j < n; j++)
            {
                if (i == j || i + j == n - 1)
                {
                    printf("*");
                }
                else
                {
                    printf(" ");
                }
            }
            printf("\n");
        }
    }

    return 0;
}

        这个图案相当于正反斜线加在一起了,所以判断的条件也是相当于加起来。

10、空心正方形图案

* * * * 
*     * 
*     * 
* * * * 
#include <stdio.h>

int main()
{
    int n = 0;
    while ((scanf("%d", &n)) != EOF)
    {
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (0 == i || n - 1 == i || 0 == j || n - 1 == j)
                {
                    printf("* ");
                }
                else 
                {
                    printf("  ");
                }
            }
            printf("\n");
        }
    }
    return 0;
}

        输出0行和0列,最后一行和最后一列。

11、空心三角形图案

*       
* *     
*   *   
* * * * 
#include <stdio.h>

int main()
{
    int n = 0;
    //多组输入
    while (~scanf(" %d", &n))
    {
        //控制行
        for (int i = 0; i < n; i++)
        {
            //控制列
            for (int j = 0; j < n; j++)
            {
                //控制打印
                if (i == n - 1 || j == 0 || i == j)
                {
                    printf("* ");
                }
                else
                {
                    printf("  ");
                }
            }
            printf("\n");
        }
    }

    return 0;
}

        输出第一列和最后一行,以及i与j相等的那一条斜线

总结

        对于打印图案,如果是对称的,将其分成上下两层分别单独考虑,根据递增和递减情况约束控制打印层数的条件,一般i控制行数,j控制列数,如果是先遍历空格再遍历*的就是两个同一级的for循环,单独思考寻找规律

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值