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

时间:2021-02-15 03:21:58

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

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

题目分布为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("\n");
    }
    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("\n");
    }
    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("\n");
	}
	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("\n输入出错,请重输!");
        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("\n");
    }
    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

**********************************/