zoukankan      html  css  js  c++  java
  • 一步步学算法(算法题解)---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
    
    **********************************/


  • 相关阅读:
    [DB] 数据库的连接
    JS leetcode 翻转字符串里的单词 题解分析
    JS leetcode 拥有最多糖果的孩子 题解分析,六一快乐。
    JS leetcode 搜索插入位置 题解分析
    JS leetcode 杨辉三角Ⅱ 题解分析
    JS leetcode 寻找数组的中心索引 题解分析
    JS leetcode 移除元素 题解分析
    JS leetcode 最大连续1的个数 题解分析
    JS leetcode 两数之和 II
    JS leetcode 反转字符串 题解分析
  • 原文地址:https://www.cnblogs.com/riskyer/p/3310635.html
Copyright © 2011-2022 走看看