一步步学算法(算法题解)---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("\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



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


 

 

 

 

你可能感兴趣的:(算法)