大家好,这里是刚接触C语言的小萌新。
今天再来分享一道关于矩阵的题目
题目要求:输入两个整数n与m代表矩阵的行数与列数,输出蛇形矩阵。(蛇形矩阵,指从矩阵的(1.1)开始,向右依次填写1,2,3,,,遇到边界或已填的数右转,直到填满整个矩阵。
考虑到存在四个方向,小萌新选择设定一个参数d(direction)来表示前进的方向,用switch函数判断如何前进。由于n和m的大小不确定,为了节约内存,小萌新采用了变长数组(variable-length array,VLA)来表示这个矩阵。需要注意的是变长数组在定义时不能被初始化。
#include<stdio.h>
int main (){
int n,m;
scanf("%d %d",&n,&m);
int A[n+2][m+2];//定义变长数组
int i=0,j=0,k=1;
for(i=n+1;i>=0;i--) for(j=m+1;j>=0;j--)//把A初始化成周围一圈1(代表边界),中间全是0
if(i==0||i==n+1||j==0||j==m+1) A[i][j]=1;
else A[i][j]=0;
i=j=1;
int d=1;
while(k<=n*m){//k=n*m时填充完毕
A[i][j]=k++;
switch(d){//用d代表前进的方向
case 1:if(A[i][j+1]){//if用于判断是否遇到非0数
i++;
d=2;
}
else j++;
break;
case 2:if(A[i+1][j]){
j--;
d=3;
}
else i++;
break;
case 3:if(A[i][j-1]){
i--;
d=4;
}
else j--;
break;
case 4:if(A[i-1][j]){
j++;
d=1;
}
else i--;
break;
}
}
for(i=1;i<=n;i++) {//输出
for(j=1;j<=m;j++)
printf("%2d ",A[i][j]);
printf("\n");
}
printf("\n");
return 0;
}
运行结果:
关于变长数组与普通数组的区别(个人理解,欢迎补充):
1VLA不能再声明时初始化,当普通数组可以(int a[n]={};//错误!!)
2普通数组可能浪费内存,VLA基本不会(假如本题规定了n,m小于1000,也可直接声明A[1000][1000],但这样可能会浪费大量内存。)
但VLA与普通数组都属于静态数组,储存在栈中,程序结束后系统会自动释放。这与储存在堆里,需要程序员手动释放的动态数组是不一样的。