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