本人大二,最近开始自学算法,在此记录自己学习过程中接触的习题。与君共勉。
水平有限,目前涉及的题目都比较水。
题目分布为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 **********************************/