• 一步步学算法(算法题解)---3


    本人大二,最近开始自学算法,在此记录自己学习过程中接触的习题。与君共勉。

    水平有限,目前涉及的题目都比较水。

    题目分布为5+1.  5为自己学习的5道水题。 1为从网上找到的比较有水平的相关题目。


     

    一步步学算法(算法题解)---3

    图形输出。

    这部分应该算比较有趣的一章了。虽然涉及的算法没什么技术含量,也比较简单。但是看着控制台输出漂亮的图形,还是挺享受的。所以单独拿出一章的篇幅学习这部分内容。


     

    1.左旋方阵

    问题描述:

    在屏幕上输出一个n阶方阵(1<=n<=20)的右旋方阵,方阵的元素由1..n^2组成,排列由外向内, 顺时针方向旋转. 如下是4阶左旋方阵

    1    2    3    4

    12  13  14  5

    11  16  16  6

    10   9    8   7

    问题分析:

    判断是否到达边界,再进行相应的转向即可。

     

    #include<stdio.h>
    
    int main()
    {
    	int a[10][10]={0};      //最大矩阵10*10
    	int n=9;                //输出9*9 矩阵
        int x,y,tot;
    	x=0;
    	y=n-1;
    	a[x][y]=1;
        tot=1;
        while(tot<n*n)
        {
            while(x+1<n && !a[x+1][y])
                a[++x][y]=++tot;
            while(y-1>=0 && !a[x][y-1])
                a[x][--y]=++tot;
            while(x-1>=0 && !a[x-1][y])
                a[--x][y]=++tot;
            while(y+1<n && !a[x][y+1])
                a[x][++y]=++tot;
        }
        for(x=0;x<n;x++)
        {
            for(y=0;y<n;y++)
                printf("%3d",a[x][y]);
            printf("
    ");
        }
        return 0;
    }
    
    /**********************************
     打印结果:
     25 26 27 28 29 30 31 32  1
     24 51 52 53 54 55 56 33  2
     23 50 69 70 71 72 57 34  3
     22 49 68 79 80 73 58 35  4
     21 48 67 78 81 74 59 36  5
     20 47 66 77 76 75 60 37  6
     19 46 65 64 63 62 61 38  7
     18 45 44 43 42 41 40 39  8
     17 16 15 14 13 12 11 10  9
    **********************************/



     

    2.“魔方阵”。

    问题描述:
    所谓“魔方阵”是指这样的方阵,它的每一行、每一列以及对角线之和均相等。例如,三阶魔方阵为:

    8  1  6

    3  5  7

    4  9  2

    要求打印由1到n*n的奇数构成的魔方阵。

    问题分析:

    魔方阵中各数的排列规律如下:

    (1) 将"1"放在第一行中间一列;
    (2) 从"2"开始直到n*n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1;

    (3) 如果上一数的行数为1,则下一数的列数为n(指最下一行);

    (4) 当上一个数的列数为n时,下一个数的列数应为1,行数减1;
    (5) 如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面. 


    #include<stdio.h>
    
    int main()
    {
        int n, i, j, k;
        int arr_[21][21] = {0};
        printf("请输入魔方的阶数:");
        scanf("%d",&n);
        i = 1;
        j = n / 2 + 1;
        arr_[i][j] = 1;
        for (k=2; k<=n*n; k++)
        {
            if ((arr_[--i][++j]!=0)||(i==0)&&(j==n+1))
            {
                j--;
                i+=2;
            }
            else
            {
                if (j==n+1)
                    j=1;
                if (i==0)
                    i=n;
            }
            arr_[i][j]=k;
        }
        for (i=1;i<=n;i++)
        {
            for (j=1;j<=n;j++)
                printf("%4d",arr_[i][j]);
            printf("
    ");
        }
        return 0;
    }
    
    /**********************************
     打印结果:
     请输入魔方的阶数:3
     8   1   6
     3   5   7
     4   9   2
    **********************************/


    3.杨辉三角

    问题描述:

    编一程序:要求输入一正整数,打印出杨辉三角,如输入5,则输出:

            1

          1   1

        1   2   1

      1  3    3   1  

    1   4   6   4  1 

    问题分析:

    可用一数组来完成,仔细观察,可将该三角看成如下图形:

    1
    1 1
    1 2 1

    1 3 3 1

    1 4 6 4 1

    仔细观察该图形,可知该数组的第一列与对角线上的元素均为1,从第三行到第n行的aa[i][j]=aa[i-1][j-1]+aa[i-1][j]. 

    #include <stdio.h>
    int main()
    {
        int a[10][10];
    	int i,j;
    	for(i=0;i<10;i++)
    	{a[i][0]=1;a[i][i]=1;}
    	for(i=2;i<10;i++)
    	{
    		for(j=1;j<i;j++)
    			a[i][j]=a[i-1][j]+a[i-1][j-1];
    	}
    	for(i=0;i<10;i++)
    	{
    		for(j=0;j<=i;j++)
                printf("%5d",a[i][j]);
    		printf("
    ");
    	}
    	return 0;
    }
    
    /**********************************
     打印结果:
     1
     1    1
     1    2    1
     1    3    3    1
     1    4    6    4    1
     1    5   10   10    5    1
     1    6   15   20   15    6    1
     1    7   21   35   35   21    7    1
     1    8   28   56   70   56   28    8    1
     1    9   36   84  126  126   84   36    9    1
    **********************************/


    4。字母菱形

    问题描述:

    打印字母棱形.如键盘上输入F,则屏幕上输出如下棱形:

               A

             A  B

           A  B  C

         A  B  C  D

       A  B  C  D  E

     A  B  C  D  E  F

       A  B  C  D  E

         A  B  C  D

           A  B  C

             A  B

                A 


    问题分析:

    没什么特别的技巧可言把。  就是打印。 比较水

    #include "math.h"
    #include <stdio.h>
    
    int main()
    {
        int i, j, k = 0;
        char m;
        while (k==0)
        {
            printf("请输入任一字母:");
            scanf(" %c", &m);
            if ((m>='a')&&(m<='z'))
            {
                m = m - 32;
                k = 1;
            }
            else if ((m>'Z')||(m<'A'))
                printf("
    输入出错,请重输!");
            else
                k=1;
        }
        m = m-'A';
        for (i=0; i<=2*m; i++)
        {
            for (j=35; j>=m-fabs(m-i); j--)
                printf(" ");
            for(j=0; j<=m-fabs(m-i); j++)
                printf("%c ",j+'A');
            printf("
    ");
        }
        return 0;
    }
    
    /**********************************
     打印结果: (注:在控制台会显示菱形,在这里粘贴的时候出错。)
     请输入任一字母:f
     A
     A B
     A B C
     A B C D
     A B C D E
     A B C D E F
     A B C D E
     A B C D
     A B C
     A B
     A
    
    **********************************/


  • 相关阅读:
    lower_bound &&upper_bound
    二分/三分
    $qsort$
    define
    typedef
    string
    queue
    nyoj Arbitrage (Bellman-Ford)
    nyoj 谍战 (最小割最大流)
    nyoj 网络的可靠性(。。。)
  • 原文地址:https://www.cnblogs.com/riskyer/p/3310635.html
Copyright © 2020-2023  润新知