北航机试C语言矩阵问题
矩阵问题
1. 给一个二维数组A赋值如下数据:
| 0 | 1 | 1 | 1 | 1 |
|---|---|---|---|---|
| -1 | 0 | 1 | 1 | 1 |
| -1 | -1 | 0 | 1 | 1 |
| -1 | -1 | -1 | 0 | 1 |
| -1 | -1 | -1 | -1 | 0 |
2. 输出以下5×5的矩阵
| 1 | 1 | 1 | 1 | 1 |
|---|---|---|---|---|
| 2 | 1 | 1 | 1 | 1 |
| 3 | 2 | 1 | 1 | 1 |
| 4 | 3 | 2 | 1 | 1 |
| 5 | 4 | 3 | 2 | 1 |
3. 拐角矩阵
| 1 | 1 | 1 |
|---|---|---|
| 1 | 2 | 2 |
| 1 | 2 | 3 |
- 左上拐角
#include<stdio.h>
void main()
{ int i,j,k,n;
printf("n : ");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{ k=i>j?j:i;
printf("%4d",k);
}
printf("\n");
}
}
| 3 | 2 | 1 |
|---|---|---|
| 2 | 2 | 1 |
| 1 | 1 | 1 |
- 右下拐角
#include<stdio.h>
void main()
{ int i,j,k,n;
printf("n : ");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{ if(i<=j)
printf("%4d",n+1-j);
else
printf("%4d",n+1-i);
}
printf("\n");
}
}
- 左下拐角
| 1 | 2 | 3 |
|---|---|---|
| 1 | 2 | 2 |
| 1 | 1 | 1 |
#include<stdio.h>
void main()
{ int i,j,k,n;
printf("n : ");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{ if(i+j<=n+1)
printf("%4d",j);
else
printf("%4d",n+1-i);
}
printf("\n");
}
}
| 1 | 1 | 1 |
|---|---|---|
| 2 | 2 | 1 |
| 3 | 2 | 1 |
- 右上拐角
#include<stdio.h>
void main()
{ int i,j,k,n;
printf("n : ");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{ if(i+j<=n+1)
printf("%4d",i);
else
printf("%4d",n+1-j);
}
printf("\n");
}
}
| 1 | 1 | 1 | 1 | 1 |
|---|---|---|---|---|
| 1 | 2 | 2 | 2 | 1 |
| 1 | 2 | 3 | 2 | 1 |
| 1 | 2 | 2 | 2 | 1 |
| 1 | 1 | 1 | 1 | 1 |
4. 回形矩阵
方法1:四个拐角矩阵拼合而成。
方法1改进:减少判断条件。
#include<stdio.h>
main()
{ int i,j,k,n,mi,ma;
printf("n : ");
scanf("%d",&n);
for(i=1;i<=n;i++)
{ mi=i<=n+1-i?i:n+1-i;
ma=n+1-mi;
for(j=1;j<=n;j++)
{ k=j<mi?j:ma<j?n+1-j:mi;
printf("%3d",k);
}
putchar('\n');
}
}
方法2:利用对称性。
#include<stdio.h>
#define N 20
void main()
{
int a[N][N]={0},i,j,Q,n;
printf("n=");
scanf("%d",&n);
Q=n/2+1;
for(i=1;i<=Q;i++)
for(j=1;j<=Q;j++)
{if(i<=j)
a[i][j]=i;
else
a[i][j]=j;
a[i][n+1-j]=a[i][j];
a[n+1-i][j]=a[i][j];
a[n+1-i][n+1-j]=a[i][j];
}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
方法3:按圈打。
#include <stdio.h>
int min(int a,int b,int c,int d)
{
int m=a;
if(m >b) m=b;
if(m >c) m=c;
if(m >d) m=d;
return m;
}
main()
{ int i,j,k,n,mi,ma;
printf("n : ");
scanf("%d", &n);
for(i=1;i <=n;i++)
{ for(j=1;j <=n;j++)
{ k=min(i,j,n+1-i,n+1-j);
printf("%4d",k);
}
putchar('\n');
}
}
5. 螺旋矩阵
| 1 | 16 | 15 | 14 | 13 |
|---|---|---|---|---|
| 2 | 17 | 24 | 23 | 12 |
| 3 | 18 | 25 | 22 | 11 |
| 4 | 19 | 20 | 21 | 10 |
| 5 | 6 | 7 | 8 | 9 |
拟人法:按圈行走
#include<stdio.h>
#define N 20
void main()
{
int a[N][N]={0};
int n,s,i,j,edge;
printf("n=");
scanf("%d",&n);
edge=n,s=1;
i=j=1;
do{
while(a[i][j]==0 && i<=edge)
{a[i][j]=s;
s++;i++;}
i--;j++;
while(a[i][j]==0 && j<=edge)
{a[i][j]=s;
s++;j++;}
j--;i--;
while(a[i][j]==0 && i>=n+1-edge)
{a[i][j]=s;
s++;i--;}
i++;j--;
while(a[i][j]==0 && j>=n+1-edge)
{a[i][j]=s;
s++;j--;}
j++;i++;
}while(s<=n*n);
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
解析法:按区域填空
#include<stdio.h>
main()
{ int n,i,j,k,s,d,l;
int a[20][20]={0};
printf("n : ");scanf("%d",&n);
i=j=1;
for(k=1;k<=n*n;k++)
{ a[i][j]=k;
if(i+j<n+1 && i>=j-1) i++;
else if (i>j && i+j>=n+1) j++;
else if (i+j>n+1 && i<=j) i--;
else if(i+j<=n+1 &&i<j-1) j--;
}
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
解析法:按圈、段,位置填空
#include<stdio.h>
#define N 20
void main()
{ static int a[N][N];
int i,j,D,Q,G,n,k,m,s;
printf("n=");
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i>=j && i+j<n+1)
{D=1;Q=j;G=i-(Q-1);}
else if(i+j>=n+1 && i>j)
{D=2;Q=n+1-i;G=j-(Q-1);}
else if(i<=j && i+j>n+1)
{D=3;Q=n+1-j;G=n+1-i-(Q-1);}
else
{D=4;Q=i;G=n+1-j-(Q-1);}
s=0;m=n-1;
for(k=1;k<=Q-1;k++)
s+=4*(m-2*(k-1));
a[i][j]=s+(D-1)(m-2(Q-1))+G;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
6. 斜行矩阵
| 1 | 2 | 4 | 7 | 11 |
|---|---|---|---|---|
| 3 | 5 | 8 | 12 | 16 |
| 6 | 9 | 13 | 17 | 20 |
| 10 | 14 | 18 | 21 | 23 |
| 15 | 19 | 22 | 24 | 25 |
#include<stdio.h>
#define N 20
void main()
{ static int a[N][N];
int i=1,j=1,n,k=1;
printf("n=");
scanf("%d",&n);
a[1][1]=k;
while(k++<=25)
if(i==n)
{i=j+1;j=n;a[i][j]=k;}
else if(j==1)
{j=i+1;i=1;a[i][j]=k;}
else
{i++;j--;a[i][j]=k;}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
7. 蛇形矩阵
| 1 | 2 | 6 | 7 | 15 |
|---|---|---|---|---|
| 3 | 5 | 8 | 14 | 16 |
| 4 | 9 | 13 | 17 | 22 |
| 10 | 12 | 18 | 21 | 23 |
| 11 | 19 | 20 | 24 | 25 |
#include<stdio.h>
#define N 20
void main()
{
static int a[N][N];
int i,j,n,d,k;
printf("n=");
scanf("%d",&n);
i=j=1;d=1;
for(k=1;k<=n*n;k++)
{
a[i][j]=k;
i-=d;j+=d;
if(i==n+1) {i=n;j+=2;d=-d;}
else if(j==n+1) {i+=2;j=n;d=-d;}
else if(i==0) {i=1;d=-d;}
else if(j==0) {j=1;d=-d;}
}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
| 1 | ||||
|---|---|---|---|---|
| 1 | 1 | |||
| 1 | 2 | 1 | ||
| 1 | 3 | 3 | 1 | |
| 1 | 4 | 6 | 4 | 1 |
8. 杨辉三角阵
使用二维数组
include<stdio.h>
#define N 20
void main()
{
static int a[N][N];
int i,j,n;
printf("n=");
scanf("%d",&n);
a[0][0]=1;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=1;i<=n;i++)
{for(j=1;j<=i;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
使用一维数组
#include<stdio.h>
#define N 20
void main()
{
static int a[N];
int i,j,n;
printf("n=");
scanf("%d",&n);
a[1]=1;
for(i=1;i<=n;i++)
{for(j=i;j>=1;j--)
a[j]=a[j]+a[j-1];
for(j=1;j<=i;j++)
printf("%4d",a[j]);
printf("\n");
}
}
9. 直角三角阵
| 1 | 3 | 6 | 10 | 15 |
|---|---|---|---|---|
| 2 | 5 | 9 | 14 | |
| 4 | 8 | 13 | ||
| 7 | 12 | |||
| 11 |
- 形式1
拟人法:
#include<stdio.h>
#define N 20
void main()
{
static int a[N][N];
int i=1,j=1,n,k=1;
printf("n=");
scanf("%d",&n);
a[1][1]=1;
while(k++<=n*(n+1)/2)
if(i==1)
{i=j+1;j=1;a[i][j]=k;}
else
{i--;j++;a[i][j]=k;}
for(i=1;i<=n;i++)
{for(j=1;i+j<=n+1;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
解析法:
#include<stdio.h>
#define N 20
void main()
{
static int a[N][N];
int i,j,n;
printf("n=");
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n+1-i;j++)
if(i==1 && j==1)
a[i][j]=1;
else if(j==1)
a[i][j]=a[i-1][1]+i-1;
else
a[i][j]=a[i][j-1]+j+(i-1);
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
解析法:按层打印
#include<stdio.h>
#define N 20
void main()
{
static int a[N][N];
int i,j,n,L;
printf("n=");
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n+1-i;j++)
{L=i+j-1;
a[i][j]=L*(L-1)/2+1+j-1;
}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
- 形式2
| 1 | 6 | 10 | 13 | 15 |
|---|---|---|---|---|
| 2 | 7 | 11 | 14 | |
| 3 | 8 | 12 | ||
| 4 | 9 | |||
| 5 |
#include<stdio.h>
#define N 20
void main()
{
static int a[N][N];
int i=1,j=1,n,k=1;
printf("n=");
scanf("%d",&n);
a[1][1]=1;
while(k++<=n*(n+1)/2)
if(i+j==n+1)
{j=n+1-i+1;i=1;a[i][j]=k;}
else
{i++;a[i][j]=k;}
for(i=1;i<=n;i++)
{for(j=1;i+j<=n+1;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
- 形式3
| 1 | ||||
|---|---|---|---|---|
| 2 | 6 | |||
| 3 | 7 | 10 | ||
| 4 | 8 | 11 | 13 | |
| 5 | 9 | 12 | 14 | 15 |
#include<stdio.h>
#define N 20
void main()
{
static int a[N][N];
int i=1,j=1,n,k=1;
printf("n=");
scanf("%d",&n);
a[1][1]=1;
while(k++<=n*(n+1)/2)
if(i==n)
{i=j+1;j++;a[i][j]=k;}
else
{i++;a[i][j]=k;}
for(i=1;i<=n;i++)
{for(j=1;j<=i;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
| 1 | ||||
|---|---|---|---|---|
| 6 | 2 | |||
| 10 | 7 | 3 | ||
| 13 | 11 | 8 | 4 | |
| 15 | 14 | 12 | 9 | 5 |
- 形式4
#include<stdio.h>
#define N 20
void main()
{
static int a[N][N];
int i=1,j=1,n,k=1;
printf("n=");
scanf("%d",&n);
a[1][1]=1;
while(k++<=n*(n+1)/2)
if(i==n)
{i=n+1-j+1;j=1;a[i][j]=k;}
else
{i++;j++;a[i][j]=k;}
for(i=1;i<=n;i++)
{for(j=1;j<=i;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
1. 打印星号图。
- 共打印3行,每列6个。
| * | * | * | * | * | * |
|---|---|---|---|---|---|
| * | * | * | * | * | * |
| * | * | * | * | * | * |
- 平行四边形
| * | * | * | * | |||
|---|---|---|---|---|---|---|
| * | * | * | * | |||
| * | * | * | * | |||
| * | * | * | * |
- 等腰三角形
| * | ||||||
|---|---|---|---|---|---|---|
| * | * | * | ||||
| * | * | * | * | * | ||
| * | * | * | * | * | * | * |
- 菱形
| * | ||||||
|---|---|---|---|---|---|---|
| * | * | * | ||||
| * | * | * | * | * | ||
| * | * | * | * | * | * | * |
| * | * | * | * | * | ||
| * | * | * | ||||
| * |
方法2:共7行,上4行:每i行先打印4-i个空格,再打印2i-1个‘*’号。
下3行:行数递减时,每i行先打印4-i个空格,再打印2i-1个‘*’号。
对m行,n=m/2+1,先打印1n行,再打印n-11行。
include<stdio.h>
void main()
{
int i,j,n,m;
printf("input m");
scanf("%d",&m);
n=m/2+1;
for(i=1;i<=n;i++)
{
for(j=1;j<=n-i;j++)
putchar(' ');
for(j=1;j<=2*i-1;j++)
putchar('*');
printf("\n");
}
for(i=n-1;i>0;i--)
{
for(j=1;j<=n-i;j++)
putchar(' ');
for(j=1;j<=2*i-1;j++)
putchar('*');
printf("\n");
}
}
方法3:统一处理
#include<stdio.h>
#include<math.h>
void main()
{
int i,j;
for (i=1;i<=7;i++)
{ for (j=1;j<=abs(i-4);j++) printf(" ");
for (j=1;j<=7-2abs(i-4);j++) printf("");
printf("\n");
}
}
- 两个等腰三角形
| * | * | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| * | * | * | * | * | * | ||||||||
| * | * | * | * | * | * | * | * | * | * | ||||
| * | * | * | * | * | * | * | * | * | * | * | * | * | * |
- 两个平行四边形
| * | * | * | * | * | * | * | * | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| * | * | * | * | * | * | * | * | ||||||
| * | * | * | * | * | * | * | * | ||||||
| * | * | * | * | * | * | * | * |
2. 打印字母等腰三角形
- 三角形的大小由键盘输入,如n=5,如图
| A | ||||||||
|---|---|---|---|---|---|---|---|---|
| A | B | C | ||||||
| A | B | C | D | E | ||||
| A | B | C | D | E | F | G | ||
| A | B | C | D | E | F | G | H | I |
- 打印字母对称的等腰三角形,三角形大小由键盘输入。如图
| A | ||||||||
|---|---|---|---|---|---|---|---|---|
| B | A | B | ||||||
| C | B | A | B | C | ||||
| D | C | B | A | B | C | D | ||
| E | D | C | B | A | B | C | D | E |
